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