什么算法在静态方法中运行T类型定义只有<! - ?超级T - > <! - ?延伸T - > args?

时间:2015-09-21 22:00:35

标签: java generics inheritance

Collections类有静态方法copy

    public static <T> void ...copy(List<? super T> dest, List<? extends T> src) {
           //...
           ListIterator<? super T> di=dest.listIterator();
           ListIterator<? extends T> si=src.listIterator();
           //...
    }

假设我有hierarhy:

  • Apple.class - &gt; Fruit.class(Apple是Fruit类的子类型)
  • Apple.class - &gt; IMakeJuice.class(Apple是IMakeJuice接口的子类型)

我执行:

List<Object> objList = new ArrayList<Object>();
List<Apple> appleList = new ArrayList<Apple>();
Collections.copy(objList, appleList);

是否可以投放到FruitIMakeJuiceObjectApple

2 个答案:

答案 0 :(得分:3)

它将是满足边界的最具体的类型,即T将是Apple

引用https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

  

推理算法试图找到适用于所有参数的最具体类型。

答案 1 :(得分:1)

正如Andy Turner已经回答的那样,T将是Apple

对于其他类似的问题,您的IDE可以告诉您。我使用Eclipse,但我认为其他人也会这样做。

如果将以下内容添加到任何.java文件中:

class Test {
    void test() {
        List<Object> objList = new ArrayList<Object>();
        List<Apple> appleList = new ArrayList<Apple>();
        Collections.copy(objList, appleList);
    }
}
class Fruit {}
interface IMakeJuice {}
class Apple extends Fruit implements IMakeJuice {}

然后将鼠标悬停在copy上,或点击并按F2键,它会显示解析T的javadoc,包括方法定义:

<Apple> void java.util.Collections.copy(List<? super Apple> dest, List<? extends Apple> src)

这对于识别调用多个重载方法中的哪一个非常有用,例如: String.valueOf(1)String.valueOf((short)1)都会调用int版本,而String.valueOf(1.0)会调用double版本。