java - 返回的列表是什么类型?

标签 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 方法返回的列表对象的类型是什么?如何成功地将类型分配给返回值?

最佳答案

推断的类型为List<Test.Obj<? extends Number & Comparable<? extends Number & Comparable<?>>>>如消息所示。这是因为 Java 选择了给定参数所共有的最具体的类型(两者的类型参数都是实现 NumberComparable )。为了使其仅使用您感兴趣的类型,Obj<? extends Number> ,称之为:

List<Obj<? extends Number>> lst = Test.<Obj<? extends Number>>lstOf(intVal, longVal);

关于java - 返回的列表是什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5504963/

相关文章:

java - 在Java中使用 "DynaArray<int>"时出现语法错误?

c# 无法将对象强制转换为具有多个泛型参数的方法中的接口(interface)

generics - 将泛型 Result<T, E> 定义为返回类型

java - 在Java中如何用字符串替换任意字符?

java - Eclipse 已停止工作并且不再启动

Java 泛型 - 在我调用 instanceof 之后,有什么方法可以避免强制转换(和未经检查的警告)?

Java 泛型和简单类型

使用 TagSoup 解析页面 URL 以创建 DOM 时出现 java IOException

java - 修改LabelField的大小(黑莓)

java - 在 Java 中选择没有 switch 语句的子类