Java 返回的列表的类型是什么?
考虑以下代码:Java 返回的列表的类型是什么?,java,generics,Java,Generics,考虑以下代码: class Test{ static <T> List<T> lstOf(T ...values){ List<T> lst = new ArrayList<T>(values.length); for ( T val : values) lst.add(val); return lst; } static class Obj<T>{
class Test{
static <T> List<T> lstOf(T ...values){
List<T> lst = new ArrayList<T>(values.length);
for ( T val : values)
lst.add(val);
return lst;
}
static class Obj<T>{
T value;
public Obj(T val){
this.value = val;
}
}
public static void main(String [] args){
Obj<Integer> intVal = new Obj<Integer>(22);
Obj<Long> longVal = new Obj<Long>(22L);
List<Obj<? extends Number>> lst = lstOf(intVal, longVal);
}
}
类测试{
静态列表(T…值){
List lst=新的ArrayList(values.length);
for(T val:值)
第一次添加(val);
返回lst;
}
静态类Obj{
T值;
公共Obj(T val){
this.value=val;
}
}
公共静态void main(字符串[]args){
Obj intVal=新Obj(22);
Obj longVal=新Obj(22L);
列表>>>
lstOf方法返回的列表对象的类型是什么?如何成功地将类型分配给返回值?它是传递给该方法的参数类型
如果调用
lstOf(String…strs)
则结果为List
推断类型为Listcolin有详细答案,但我建议改为指定lst
:
List<? extends Obj<? extends Number>> lst = lstOf(intVal, longVal);
listLimition:在这个解决方案中,除了null
之外,不能在lst
中附加任何内容。是的,就像@meriton所说的,这会对列表施加额外的限制,而这些限制是不必要的。谢谢。您的解决方案对我也有效(因为我不需要修改lstOf()方法返回的列表)谢谢!这很有效。但是使用-Xlint编译时仍然会警告我未经检查的泛型数组创建--我想这与varargs lstOf方法有关。@Ajay:是的,泛型类型和varargs不能很好地结合在一起。在Java 7中,您可以在声明lstOf
时抑制该警告,这样调用方就不会得到它。酷。fingers为JDK 7交叉
List<Obj<? extends Number>> lst = Test.<Obj<? extends Number>>lstOf(intVal, longVal);
List<? extends Obj<? extends Number>> lst = lstOf(intVal, longVal);