java - 强制转换 "type-erased"对象安全吗?

标签 java oop generics type-erasure

一个类(实现通用接口(interface))有一个返回 java.lang.Object 数据类型而不是预期数据类型的方法。在调用者语句中对其进行类型转换是否安全?

import java.io.*; 
import java.lang.*;

interface dataCharge<A>{
    public A change(A ele); 
}

class APCDcharge implements dataCharge<APCDcharge>{
    private String name;
    private Integer charge;
    public void setName(String name){
        this.name = name;
    }
    public void setCharge(Integer charge){
        this.charge = charge;
    }
    public String getName(){
        return name;
    }
    public Integer getCharge(){
        return charge;
    }
    public String getKey(){
        return name+":"+charge;
    }
    @Override
    public APCDcharge change(APCDcharge ele){
        APCDcharge newele = new APCDcharge();
        newele.setCharge(ele.getCharge()+100);
        newele.setName(ele.getName());
        return newele;
    }
}

public class Main {
    public static void main(String[] args) {
        APCDcharge c = new APCDcharge();
        c.setName("ABC");
        c.setCharge(100);
        APCDcharge d = timePass(c);
        System.out.println(d.getKey());
    }
    private static <T extends dataCharge> T timePass(T element){
        T res = element.change(element);
        return res;
    }
}

上面的代码片段给出了错误:

错误:类型不兼容:对象无法转换为 T T res = element.change(element);

我还尝试使用 T 数据类型对 element.change(element) 进行类型转换,例如:

T res = (T)element.change(element);

并且代码正在编译(带有警告:注意:Main.java 使用未经检查或不安全的操作。),但正确执行。这是消除错误的安全方法吗?还有其他方法可以纠正吗?

最佳答案

你的问题是在你的static方法 T 的类型绑定(bind)是原始类型 ( dataCharge )。

进行以下更改:

private static <T extends dataCharge<T>> T timePass(T element){
    T res = element.change(element);
    return res;
}

T extends dataCharge<T>而不是 T extends dataCharge .

现在代码无需转换即可通过编译。

关于java - 强制转换 "type-erased"对象安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822877/

相关文章:

java - 使用 Java 将基于表格的布局转换为 div

java - 在 Java 中反序列化 Scala 反序列化的对象

java - Vaadin布局扩展

oop - 如何建模进行计算并存储它们的类?

c++ - 对象组合促进代码重用。 (T/F,为什么)

java - HashSet add(Object o) 错误

ios - 返回 Result<Object> 时,Realmswift 通用函数调用崩溃

java - 寻找单元测试的最佳实践? (如果不开发测试优先)

java - 嵌套开关还是多功能,什么才是更好的设计?

java - 确保 Java 中的通用通配符匹配