什么算法运行通过静态方法中的T类型定义只有<超级T>& lt; ?T>延伸;arg游戏



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();
           //...
    }

假设我有层次结构:

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

和我执行:

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

将T转换为Fruit, IMakeJuice, ObjectApple吗?

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

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

推理算法试图找到与所有参数都适用的最特定的类型。

正如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版本。

最新更新