我试图理解 Java 中的泛型,但遇到了一些问题。这是我写的代码:
class Superclass{
}
class Subclass extends Superclass{
}
class Container <T>{
T elem;
}
public class Test {
public static void main(String[] args) {
Container<? extends Superclass> b = new Container<Superclass>();
b.elem = new Superclass();
}
}
Run Code Online (Sandbox Code Playgroud)
这个结果是一个奇怪的异常,我无法理解:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from Superclass to capture#1-of ?
at Test.main(Test.java:4)
Run Code Online (Sandbox Code Playgroud)
我尝试做出一些改变。如果我将注释行替换为:
Container<Superclass> b = new Container<Superclass>();
Run Code Online (Sandbox Code Playgroud)
一切正常。这对我来说很有意义。这只是普通的泛型,没有任何通配符。
然后我再次更改为注释行:
Container<?> b = new Container<Superclass>();
Run Code Online (Sandbox Code Playgroud)
我很惊讶这也导致了异常。然而我发现即使使用通配符,Java 也能保证类型安全。我想我明白为什么这会导致异常。
但我就是不明白为什么
Container<? extends Superclass> b …Run Code Online (Sandbox Code Playgroud)