【发布时间】:2018-02-17 22:56:16
【问题描述】:
在这段代码中,T 可以是 A、B、C 或 D,但 Eclipse 显示它是 D。
static class A { }
static class B extends A { }
static class C extends B { }
static class D extends C { }
static <T> void copy(List<? super T> dst, List<? extends T> src) {
for (T t : src)
dst.add(t);
}
public static void main(String[] args) {
List<A> dst = new ArrayList<>();
List<D> src = new ArrayList<>();
copy(dst, src); // Eclipse shows T is D
}
对于如何进行类型推断以及为什么选择 D 是否有任何规则?
【问题讨论】:
-
Java 总是选择“最具体的”重载。显然,同样的逻辑也适用于此。
-
dst.addAll(src);显示了什么? -
在 JLS 中找到了关于如何选择方法的相关部分,特别是关于“最具体的方法”的部分:docs.oracle.com/javase/specs/jls/se8/html/…(它是不太容易实现的方法之一) - 阅读 JLS 的部分内容,不过……)
-
(我会说这个问题肯定是另一个问题的重复,但我不确定该选择哪一个......(也许......(警告:蹩脚的双关语!).. .最具体的?...呵呵...)
-
标签: java generics type-inference generic-programming inferred-type