不,这个问题不是关于 ?和T;这是关于我如何转动 < ? > 参数转换为命名的 < T >。 考虑这个示例代码:
import java.io.Serializable;
class A<T extends Serializable> {
<S extends Serializable> void bar(S arg) { }
void bar2(T arg) { }
}
public class B {
A<? extends Serializable> myA = null;
<T extends Serializable> void foo(T arg) {
myA.bar(arg);
myA.bar2(arg);
}
}
我的问题是上面没有编译;调用 bar2() 给了我
The method bar2(capture#2-of ? extends Serializable) in the type
A<capture#2-of ? extends Serializable> is not applicable for the arguments (T)
我猜“原因”是 myA 是 < ?扩展序列化 >;但是 B.foo 中的 T ... 很好,一个命名为 T;而不是通配符 ?。
“解决”这个问题的一种方法是使
那么 - 有没有办法让我的 B 类在我的示例代码中按“预期”使用 A.bar2()?
编辑:准确地说 - bar() 方法对我没有帮助;因为那里的“S”……与我在 A 类中真正使用的“T”不兼容。
最佳答案
你进了死胡同。
A<? extends Serializable> myA = ...;
所以 myA
是 A
未知的东西。它可能是 A<String>
, 或 A<Integer>
或 A<Banana>
.你只是不知道。假设它是一个 A<Banana>
.
<T extends Serializable> void foo(T arg) {
所以 foo()
接受任何可序列化的:String、Integer、Banana、Apple 等等。假设它是用 Integer
调用的作为参数。
myA.bar2(arg);
因此,根据上述假设,这将调用 bar2()
以整数作为参数,尽管 myA
是 A<Banana>
.这不能被编译器接受:它显然不是类型安全的。 B
必须通用。
关于java - 泛型:如何捕获通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31454564/