java未经检查的重写(嗯,我似乎需要我的泛型方法)
我有通用接口操作数:
public interface Operand<T extends Operand<T>> {
T add(Operand<T> op);
T sub(Operand<T> op);
T mul(Operand<T> op);
T div(Operand<T> op);
}
它由两个类实现:
public class DoubleOperand implements Operand<DoubleOperand> {
...
}
public class RationalOperand implements Operand<RationalOperand> {
...
}
我已经编写了由双操作数工厂和理性与工厂类实现的“工厂”接口:
public interface OperandFactory {
<T extends Operand<T>> Operand<T> valueOf(String s);
}
public class DoubleOperandFactory implements OperandFactory{
@Override
public Operand<DoubleOperand> valueOf(String s) { ... }
}
public class RationalOperandFactory implements OperandFactory {
@Override
public Operand<RationalOperand> valueOf(String s) { ... }
}
在我的程序中,我使用一个枚举,对象存储特定工厂的实例:
public enum OperandType {
DOUBLE(new DoubleOperandFactory()), RATIONAL(new RationalOperandFactory());
private OperandFactory fact;
OperandType(OperandFactory fact){ this.fact = fact; }
public OperandFactory getFact() { return fact; }
}
现在,由于未经检查的转换,我在两个工厂类上都收到消息警告“Unchecked overriding”,对此我非常困惑。我尝试的第一件事是(正如在类似主题中最常见的回答一样)用泛型工厂接口替换泛型方法,但最后,将它们与枚举一起使用是不可能的,枚举应该返回特定工厂,而没有<>;,因为我必须创建一个操作数列表(目前为泛型类型T扩展操作数<;T>;),并用所选工厂生成的对象填充它。重组此代码的最佳方式是什么
# 1 楼答案
这个接口并不像你想象的那样
此接口声明它的实例可以生成所需的任何类型的操作数。它不仅仅生成一种特定的操作数。它产生了所有这些
这不是你真正拥有的
你需要的是
。。。然后放弃枚举,因为你不能有不同类型的枚举。这在Java中是不允许的