我想制作这种形式的通用类:

class MyGenericClass<T extends Number> {}

问题是,我希望T可以为整数或Long,但不能为Double。因此,仅有的两个可接受的声明将是:
MyGenericClass<Integer> instance;
MyGenericClass<Long> instance;

有什么办法吗?

最佳答案

答案是不。至少没有办法使用泛型类型做到这一点。我建议将泛型和工厂方法结合起来以执行所需的操作。

class MyGenericClass<T extends Number> {
  public static MyGenericClass<Long> newInstance(Long value) {
    return new MyGenericClass<Long>(value);
  }

  public static MyGenericClass<Integer> newInstance(Integer value) {
    return new MyGenericClass<Integer>(value);
  }

  // hide constructor so you have to use factory methods
  private MyGenericClass(T value) {
    // implement the constructor
  }
  // ... implement the class
  public void frob(T number) {
    // do something with T
  }
}

这样可以确保只能创建MyGenericClass<Integer>MyGenericClass<Long>实例。尽管您仍然可以声明MyGenericClass<Double>类型的变量,但它必须为null。

关于java - 接受两种类型之一的泛型类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9141960/

10-08 21:19