有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    public interface OperandFactory {
        <T extends Operand<T>> Operand<T> valueOf(String s);
    }
    

    这个接口并不像你想象的那样

    此接口声明它的实例可以生成所需的任何类型的操作数。它不仅仅生成一种特定的操作数。它产生了所有这些

    这不是你真正拥有的

    你需要的是

     public interface OperandFactory<T extends Operand<T>> {
        T valueOf(String s);   
     }
    

    。。。然后放弃枚举,因为你不能有不同类型的枚举。这在Java中是不允许的