Общий класс, который принимает один из двух типов - PullRequest
29 голосов
/ 04 февраля 2012

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

class MyGenericClass<T extends Number> {}

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

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

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

Ответы [ 2 ]

30 голосов
/ 04 февраля 2012

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

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 голосов
/ 04 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...