gpt4 book ai didi

带有静态工厂方法的 Java 泛型

转载 作者:行者123 更新时间:2023-11-30 08:00:00 25 4
gpt4 key购买 nike

我正在尝试创建一个 Variable可以表示 Integer 的类或 Double使用泛型的值。

下面是我试过的代码。由于删除,我使用了 enum存储 Variable 的预期类型然后尝试使用它来将值初始化为正确的类型。

public class Variable<T> {

private enum Type {INTEGER, DOUBLE};
private Type type;

private T value;

public static Variable<Integer> createAsInteger() {
return new Variable<Integer>(Type.INTEGER);
}

public static Variable<Double> createAsDouble() {
return new Variable<Double>(Type.DOUBLE);
}

private Variable(Type type) {
this.type = type;

if(type == Type.INTEGER) {
value = new Integer(0);
} else {
value = new Double(0.0);
}
}

public static void main(String[] args) {
Variable.createAsInteger();
Variable.createAsDouble();
}

}

然而,当我编译它时,我收到以下消息...

error: incompatible types: Integer cannot be converted to T
value = new Integer(0);

对于 Double 同样如此.

任何人都可以解释为什么会发生这种情况,以及是否有一种方法可以解决这个问题而不必编写两个单独的类,一个用于 Integer和一个 Double

编辑

感谢您的所有回答...基于这些回答,我现在意识到有更好的方法可以做到这一点。但是,我正在努力弄清楚为什么这种方法不起作用,这样我以后就不会犯同样的错误。

当我将类定义为 public class Variable<T extends Number> 时按照建议,我仍然遇到同样的错误。

最佳答案

您的架构似乎玷污了泛型的概念。

最简单的方法是在类型参数中设置上限:

class Variable<T extends Number> {...}

然后您可以使用通用工厂方法创建 Variable<X>根据您需要的类(class):

static <X extends Number>Variable<X> create() {
return new Variable<X>();
}

然后您可以调用它:

Variable.<Integer>create(); // returns an instance of `Variable<Integer>`

这不会限制为IntegerDouble ,而是任何 Number .

如果必须,您可以通过执行以下操作来限制这些选择:

  • 为您的 create 添加一个参数方法:create(Class<X> clazz)
  • 检查您的 clazz 的值方法体内的参数:

    if (!clazz.equals(Integer.class) && !clazz.equals(Double.class)) {
    // TODO complain
    }

否则,您可以确保使用 private构造函数并提供 static createAs...非泛型方法,例如 createAsInteger等等,这将返回一个 new Variable<Integer>

关于带有静态工厂方法的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38847628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com