对"type-erased"对象进行类型转换是否安全?



类(实现通用接口(的方法可以返回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;
    }
}

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

error: incompatible types: Object cannot be converted to T T res = element.change(element);

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

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

和代码正在编译(带有警告:Note: Main.java uses unchecked or unsafe operations.(,但正确执行。这是消除错误的安全方法吗?还有其他方法可以纠正它吗?

您的问题是在您的static方法中,T的类型是RAW类型(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

现在,代码将在没有演员的情况下通过汇编。

此方法:

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

使用a raw (即未型(dataCharge。您应该键入它,加上返回dataCharge的类型,而不是dataCharge的(子(类。

给定的方式,即将自己传递到自己的方法中,表明dataCharge应该更简单地将dataCharge供应商定义为结果:

interface dataCharge<A>{
    public A change(); 
}
class APCDcharge implements dataCharge<APCDcharge> {
    // other code
    @Override
    public APCDcharge change() {
    APCDcharge newele = new APCDcharge();
    newele.setCharge(getCharge()+100);
    newele.setName(getName());
    return newele;
    }
}

然后您的timePass方法将变为:

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

最新更新