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

Kar*_* S. 0 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我打电话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

Jos*_*ica 5

当你声明class Derived<O extends Object>但然后将它初始化为just时new Derived,它就变成了一个原始类型,它会杀死所有泛型.要修复它,用它初始化new Derived<Object>new Derived<String>什么的来代替.