我有一些无法用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
的同时修复代码(以使O
是Derived
类型?
答案 0 :(得分:5)
当您声明class Derived<O extends Object>
但仅将其初始化为new Derived
时,它将变成原始类型,这将杀死所有泛型。要对其进行修复,请使用new Derived<Object>
或new Derived<String>
或其他方法对其进行初始化。