Java中自定义泛型和泛型的继承与通配符

86 阅读2分钟

自定义泛型

在Java中,泛型可以被自定义为类、接口、方法等,以便在不同场景下使用。自定义泛型时,需要注意以下几点:

  1. 类名或接口名后需要加上泛型参数,用尖括号 < > 包裹,多个参数之间用逗号分隔。

  2. 泛型参数可以是任意合法的Java标识符,通常使用单个大写字母表示。

  3. 泛型类中的成员变量、方法参数、方法返回值等都可以使用泛型参数。

  4. 泛型类中的静态成员不能引用泛型参数。

自定义泛型类

public class MyList<T> {  
    private List<T> list = new ArrayList<T>();  
      
    public void add(T t) {  
        list.add(t);  
    }  
      
    public T get(int index) {  
        return list.get(index);  
    }  
      
    public int size() {  
        return list.size();  
    }  
}  

这个类是一个简单的泛型列表类,其中的泛型参数 T 可以代表任何Java类型。

可以使用该类来创建不同类型的列表,如下所示:

MyList<Integer> intList = new MyList<Integer>();  
intList.add(1);  
intList.add(2);  
System.out.println(intList.get(0) + intList.get(1)); // 输出 3  
  
MyList<String> stringList = new MyList<String>();  
stringList.add("Hello");  
stringList.add("world");  
System.out.println(stringList.get(0) + " " + stringList.get(1)); // 输出 "Hello world"  

在这个例子中,我们创建了两个不同类型的 MyList 实例,一个包含整数,另一个包含字符串。这些列表中的元素类型由泛型参数 T 决定,这使得 MyList 类变得通用,可以用于处理任何类型的对象。

泛型继承

泛型可以使用继承来扩展其类型范围,如下所示:

public class Box<T> {  
    private T t;  
  
    public void set(T t) {  
        this.t = t;  
    }  
  
    public T get() {  
        return t;  
    }  
}  
  
public class BoxDemo<T extends Number> {  
    private T t;  
  
    public void set(T t) {  
        this.t = t;  
    }  
  
    public T get() {  
        return t;  
    }  
}  

上面的例子中,Box类是一个简单的泛型类,它可以包含任何类型的值。而BoxDemo类继承了Box类,并使用extends关键字来扩展类型范围,表示只能接收Number类及其子类的类型参数。

通配符

通配符是Java中的一个特殊符号,用于表示任何类型。Java中有两种通配符:?和? extends Type,其中?表示未知类型,而? extends Type表示任何Type类型的子类。

通配符通常与泛型类型结合使用,以提高代码的灵活性。例如:

public void printList(List<?> list) {  
    for (Object elem : list) {  
        System.out.print(elem + " ");  
    }  
    System.out.println();  
}  
  
public void printList(List<? extends Number> list) {  
    for (Number elem : list) {  
        System.out.print(elem + " ");  
    }  
    System.out.println();  
}  

上面的例子中,第一个方法接受任何类型的List,而第二个方法只接受Number及其子类的List。

下面是一个使用通配符的例子:

List<Integer> ints = Arrays.asList(123);  
List<String> strings = Arrays.asList("one""two""three");  
printList(ints);  
printList(strings);  

输出结果:

1 2 3   
one two three 

上面的例子中,printList方法可以接受任何类型的List,因此可以用于打印整数和字符串的List。