自定义泛型
在Java中,泛型可以被自定义为类、接口、方法等,以便在不同场景下使用。自定义泛型时,需要注意以下几点:
-
类名或接口名后需要加上泛型参数,用尖括号 < > 包裹,多个参数之间用逗号分隔。
-
泛型参数可以是任意合法的Java标识符,通常使用单个大写字母表示。
-
泛型类中的成员变量、方法参数、方法返回值等都可以使用泛型参数。
-
泛型类中的静态成员不能引用泛型参数。
自定义泛型类
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(1, 2, 3);
List<String> strings = Arrays.asList("one", "two", "three");
printList(ints);
printList(strings);
输出结果:
1 2 3
one two three
上面的例子中,printList方法可以接受任何类型的List,因此可以用于打印整数和字符串的List。