返回列表的类型是什么?

时间:2011-03-31 19:06:45

标签: 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>{
        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方法返回的列表对象的类型是什么?如何成功为返回值指定类型?

3 个答案:

答案 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>