一个类(实现通用接口(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/