java - 我的泛型类型转换有什么问题?

标签 java generics

我有一个 Student 类和一个 StudentPool 类,定义如下:

public class Student {
    public Student copy () {
        return new Student();
    } 
}

public class StudentPool<T extends Student> {
    public T copyStudent(T t) {
        return t.copy();
    }
}

因此,copyStudent 方法无法编译,我必须使用不安全的类型转换。我不明白为什么 Java 会认为这是非法的?

编辑: user845279、lcfseth 和 Bohemian:我认为以下对 Student 的修改可能会导致类似的情况,将父类转换为其子类,但此版本可以通过编译:

public class Student {
    public <T extends Student> T copy() {
       T rv = null; 
       return rv;
    } 
}

编辑: 忘记上面的代码:rv 可以是 null 或非安全转换。

最佳答案

假设你有一个类 SmartStudent扩展Student , 和一个 StudentPool<SmartStudent> .在这种情况下 copyStudent应该采取 SmartStudent并返回 SmartStudent ,但是 Student 中的实现没有这样做 - 它只返回一个普通的 Student实例。

编辑:

为了实现你想要的模式,你可以给出 Student及其所有子类 a copy constructor :

public class Student {
    public Student(Student other) {
        //copy other's Student fields to this instance
    } 
}

public class SmartStudent extends Student {
    public SmartStudent(SmartStudent other) {
        super(other);
        //copy other's SmartStudent fields to this instance
    }
}

并制作StudentPool摘要:

public abstract class AbstractStudentPool<T extends Student> {
    public T copyStudent(T original);
}

每个AbstractStudentPool实现将调用适当的复制构造函数:

public class SmartStudentPool extends AbstractStudentPool<SmartStudent> {
    @Override
    public SmartStudent copyStudent(SmartStudent original) {
        return new SmartStudent(original);
    }
}

关于java - 我的泛型类型转换有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10544229/

相关文章:

java - 退出Java并行流工作程序线程后的内存一致性

c# - 如何将 List<object> 转换为 List<Something Else>

java - RMI/Tomcat 6 内存泄漏

Java-声明新的泛型集时出现意外的类型错误

java - 从后台服务启动 Android Activity

scala - 如何避免 Scala 中类型绑定(bind)的重复

java - 如何选择在 Java 的泛型类中调用哪个具体实例方法

c# - 从非泛型基类调用泛型方法/委托(delegate)

c# - 如何解释这个 "call is ambiguous"错误?

java - Discord 机器人异常重复