我有一些代码无法使用 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
类型?
最佳答案
当您声明class Derived<O extends Object>
时但然后将其初始化为 new Derived
,它变成原始类型,杀死所有泛型。要修复它,请使用 new Derived<Object>
对其进行初始化或new Derived<String>
或者其他东西。
关于java - 扩展泛型类型同时引入另一个类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52618886/