java - 如何实例化一个使用给定 double 值扩展 Number 的泛型类?

标签 java generics

假设我有这个 Foo 类,它具有扩展 Number 的泛型类型变量 E。由于每个 Number 对象应该有一个 double 值,因此在实例化 E 类型的新实例时,我想给它一个 double 值。是否可以?如何?

public class Foo<E extends Number> {
    ...
    public void someMethod() {
        ... // some computation
        Class<E> typeClass;
        E newInstance = typeClass.newInstance();
        // Because every Number has a doubleValue(),
        // I would like to give newInstance a double value, how?
    }
}

或者我应该放弃泛型类型变量,而使用 Double 代替?但我不想限制用户使用ByteInteger的自由。这些数字类别是否可以互换,即,Byte 可以以某种方式转换为 Double 吗?

谢谢!!

编辑:

我正在使用泛型实现 Dijkstra 算法,该算法计算最小权重路径。这意味着边缘标签可以以某种方式累积,我能想到的用于此目的的最通用的类​​是 Number

最佳答案

首先,你的假设

Since each Number object should have a double value, when instantiating a new instance of type E I would like to give it a double value.

不正确。

例如,如何实例化具有 double 值 1.5 的 Integer?它应该通过舍入来实例化吗?通过截断?我可以很好地定义一个甚至不支持任意整数的 Number 子类,如下所示:

public static class Zero extends Number {
    @Override
    public double doubleValue() {
        return 0;
    }

    @Override
    public float floatValue() {
        return 0;
    }

    @Override
    public int intValue() {
        return 0;
    }

    @Override
    public long longValue() {
        return 0;
    }
}

如何实例化具有 double 值(如 1.5)的零?

由于没有通用逻辑可以用任意 double 值实例化 Number 的任意子类(这就是 Number 没有带 double 参数的构造函数的原因),唯一合理的方法是询问客户端提供一个工厂,可以在给定任意双值的情况下使用适用于该特定子类的自定义逻辑来构造 Number 子类的实例。就像下面这样:

  public class Foo<E extends Number> {

    public static interface NumberFactory<T extends Number> {
        T createByDoubleValue(double value);
    }

    private final NumberFactory<E> factory;

    public Foo(NumberFactory<E> factory) {
        this.factory = factory;
    }

    ...
    public void someMethod() {
      ... // some computation
      // Because every Number has a doubleValue(),
      // I would like to give newInstance a double value, how?
      E instance = factory.createByDoubleValue(1.5);
    }
  }

要使用Foo类,客户端需要定义工厂,如下所示:

Foo<Float> foo = new Foo<>(new Foo.NumberFactory<Float>() {
  @Override
    public Float createByDoubleValue(double value) {
      return new Float(value);
    }
});

关于java - 如何实例化一个使用给定 double 值扩展 Number 的泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986715/

相关文章:

java - 从泛型 ArrayList 派生泛型类型

java - 递归缺失值无法弄清楚如何修复,请测试人员

java - 在 OpenCV Java 中实现卡尔曼滤波器

java - 当我想要简单的持久性时,是否需要从 2.6 降级到 EhCache 2.5?

java - 如何使用有效的泛型声明 Class.class

c# - 在 C# 中使用 Type.GetType() 返回的类型

c# - 创建不能接收空参数的方法或列表

eclipse - 如何在 Eclipse 中调试通用方法?

java 。编译/执行 2 .java 1 包命令行

JAVA Arraylist 意外输出