在引入另一个类型参数的同时扩展泛型类型

时间:2018-10-03 02:26:30

标签: java generics

我有一些无法用JDK10编译的代码。
我将其简化为以下示例:

abstract class Base<C extends Comparable<C>> {
    C c;
    protected Base(C c) {
        this.c = c;
    }
}

class Derived<O extends Object> extends Base<String> {
    Derived(String s) {
        super(s);
    }
}

class Scratch {
    private static void printString(String s) {
        System.out.println(s);
    }

    public static void main(String[] args) {
        var d = new Derived("s");
        printString(d.c);
    }
}

当我调用printString(d.c)时,编译器会以Error:(21, 22) incompatible types: java.lang.Comparable cannot be converted to java.lang.String进行投诉。

如果我改变了
class Derived<O extends Object> extends Base<String> {

class Derived extends Base<String> {
该代码按预期工作。

如何在保持d.c类型为类型参数java.lang.String的同时修复代码(以使ODerived类型?

1 个答案:

答案 0 :(得分:5)

当您声明class Derived<O extends Object>但仅将其初始化为new Derived时,它将变成原始类型,这将杀死所有泛型。要对其进行修复,请使用new Derived<Object>new Derived<String>或其他方法对其进行初始化。