小编Jan*_*Jan的帖子

使用通配符时 Java 泛型类型不匹配

我试图理解 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)

java oop generics wildcard subtyping

2
推荐指数
1
解决办法
81
查看次数

标签 统计

generics ×1

java ×1

oop ×1

subtyping ×1

wildcard ×1