考虑以下代码:
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);
}
}
编译器抱怨“lst”的类型为
java.util.List<Test.Obj<? extends java.lang.Number&java.lang.Comparable<? extends java.lang.Number&java.lang.Comparable<?>>>>
lstOf方法返回的列表对象的类型是什么?如何成功为返回值指定类型?
答案 0 :(得分:3)
消息指示的推断类型为List<Test.Obj<? extends Number & Comparable<? extends Number & Comparable<?>>>>
。这是因为Java正在选择它给出的参数所共有的最具体的类型(两者都具有实现Number
的{{1}}的类型参数。要使其仅使用您感兴趣的类型Comparable
,请将其命名为:
Obj<? extends Number>
答案 1 :(得分:2)
ColinD有详细的答案,但我建议改为指定lst
:
List<? extends Obj<? extends Number>> lst = lstOf(intVal, longVal);
答案 2 :(得分:0)
这是您传递给方法的参数类型。
如果您致电lstOf(String ... strs)
,则结果为List<String>
。