Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在引入另一个类型参数的同时扩展泛型类型_Java_Generics - Fatal编程技术网

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

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) {

我有一些代码不是用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);
    }
}
抽象类基类{
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版中被改装到语言中。接受有效表达式中的原始类型是必要的,以确保与在泛型出现在语言中之前编写的大型代码库的向后兼容性,并确保新泛型代码和遗留代码之间的互操作性前泛型代码。