Подтвердить что ты не робот

Общий класс, который принимает любой из двух типов

Я хочу создать общий класс этой формы:

class MyGenericClass<T extends Number> {}

Проблема в том, что я хочу быть приемлемым для того, чтобы T был либо целым, либо длинным, но не двойным. Таким образом, только две приемлемые объявления будут:

MyGenericClass<Integer> instance;
MyGenericClass<Long> instance;

Есть ли способ сделать это?

4b9b3361

Ответ 1

Ответ - нет. По крайней мере, нет способа сделать это, используя общие типы. Я бы рекомендовал комбинацию дженериков и методов factory, чтобы делать то, что вы хотите.

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>, она просто должна быть нулевой.

Ответ 2

Нет, в Java нет ничего, чтобы это разрешить. Возможно, вам стоит подумать о наличии не общего интерфейса, реализованного в FooIntegerImpl и FooLongImpl. Трудно сказать, не зная больше о том, чего вы пытаетесь достичь.