Java 在引入另一个类型参数的同时扩展泛型类型
我有一些代码不是用JDK10编译的。Java 在引入另一个类型参数的同时扩展泛型类型,java,generics,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) {
我将其简化为以下示例:
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);
}
}
抽象类基类{
C C;
受保护底座(C){
这个.c=c;
}
}
类派生的扩展基{
派生(字符串s){
超级(s);
}
}
课堂擦伤{
私有静态void打印字符串(字符串s){
系统输出打印项次;
}
公共静态void main(字符串[]args){
var d=新衍生(“s”);
打印字符串(直流);
}
}
当我调用printString(d.c)
时,编译器抱怨错误:(21,22)不兼容的类型:java.lang.Comparable无法转换为java.lang.String
如果我改变类派生扩展基{
到
类派生扩展基{
代码按预期工作
如何修复代码(使
d.c
的类型为java.lang.String
)在派生的类型上保留类型参数O
,当您声明类派生的但随后将其初始化为新派生的,它将成为一个原始类型,这将杀死所有泛型。要修复它,请使用新派生的或新派生的或其他东西来初始化它.当您声明类派生
但将其初始化为新派生
时,它将成为原始类型,这将杀死所有泛型。要修复它,请使用新派生
或新派生
或其他东西来初始化它。太好了,谢谢。可以安全地说这是一个限制,因为泛型是用Java实现的?毕竟,虽然我没有提供关于类型参数O
的信息,但应该清楚的是C
是一个字符串
。我同意这一点。即使没有O,C也应该没有歧义。也许将来的Java版本会改变这一点。“太好了,谢谢。可以安全地说,这是由于Java中泛型的实现方式造成的限制吗?”?"…是的,这是Java按预期工作。泛型在5版中被改装到语言中。接受有效表达式中的原始类型是必要的,以确保与在泛型出现在语言中之前编写的大型代码库的向后兼容性,并确保新泛型代码和遗留代码之间的互操作性预泛型代码。太好了,谢谢。可以安全地说,这是一个限制,因为泛型是如何在Java中实现的吗?毕竟,虽然我没有提供关于类型参数O
,但应该清楚的是C
是一个字符串
。我同意这一点。即使没有O,也应该没有歧义也许Java的未来版本会改变这一点。“太好了,谢谢。可以肯定地说,这是由于泛型在Java中的实现方式造成的限制吗?”…是的,这是Java按预期工作。泛型在5版中被改装到语言中。接受有效表达式中的原始类型是必要的,以确保与在泛型出现在语言中之前编写的大型代码库的向后兼容性,并确保新泛型代码和遗留代码之间的互操作性前泛型代码。