Java 泛型:定义泛型时的通配符和类型参数语法 class
Java generics : wildcard and type parameter syntax when defining generic class
在下面的泛型方法声明示例中,我认为这两个方法声明是相同的,因为它们接受相同类型的参数。
public static <T extends List<? extends Number>> void fun(T arg){}
public static void foo(List<? extends Number> arg){}
好的,那为什么不允许使用以下语法来定义泛型 class?
public class foo<List<? extends Numer>> {}
按照oracle的Java教程,是不是因为我只能用语法class name<T1, T2, ..., Tn> { /* ... */ }
来定义泛型classes? Java 还提供额外的语法糖来定义泛型方法?
所以,如果我想定义一个像public class foo<T extends List<U extends Number>>
这样的泛型class来利用T
和U
,我只能通过以下方式来实现:
public class foo<U extends Number, T extends List<U>>
?有没有简洁的方法可以做到?
谢谢!
根据您的初衷...以下是有效的泛型 class
public class MyClass<T extends List<? extends Number>> {}
可以如下使用...
public class MyClass<T extends List<? extends Number>> {
T myList;
public T getMyList() {
return myList;
}
public void setMyList(T myList) {
this.myList = myList;
}
}
public class Tester {
public Tester() {
MyClass<ArrayList<Number>> list = new MyClass<>();
list.setMyList(new ArrayList<>());
list.getMyList().add(new Integer(2));
list.getMyList().add(new Long(3));
}
}
在下面的泛型方法声明示例中,我认为这两个方法声明是相同的,因为它们接受相同类型的参数。
public static <T extends List<? extends Number>> void fun(T arg){}
public static void foo(List<? extends Number> arg){}
好的,那为什么不允许使用以下语法来定义泛型 class?
public class foo<List<? extends Numer>> {}
按照oracle的Java教程,是不是因为我只能用语法class name<T1, T2, ..., Tn> { /* ... */ }
来定义泛型classes? Java 还提供额外的语法糖来定义泛型方法?
所以,如果我想定义一个像public class foo<T extends List<U extends Number>>
这样的泛型class来利用T
和U
,我只能通过以下方式来实现:
public class foo<U extends Number, T extends List<U>>
?有没有简洁的方法可以做到?
谢谢!
根据您的初衷...以下是有效的泛型 class
public class MyClass<T extends List<? extends Number>> {}
可以如下使用...
public class MyClass<T extends List<? extends Number>> {
T myList;
public T getMyList() {
return myList;
}
public void setMyList(T myList) {
this.myList = myList;
}
}
public class Tester {
public Tester() {
MyClass<ArrayList<Number>> list = new MyClass<>();
list.setMyList(new ArrayList<>());
list.getMyList().add(new Integer(2));
list.getMyList().add(new Long(3));
}
}