Общий класс с двумя иерархиями классов - PullRequest
0 голосов
/ 06 сентября 2018

У меня следующий вопрос об обобщении Java

У меня есть следующий родовой класс, который можно набросать как:

public class MyClass<T> {
    AnotherClass<T> another;
    OtherClass<T> other;
    ...
}

где ... представляет код, который не имеет отношения к делу.

Для класса MyClass<T> не так важно, какой именно тип T (на данный момент), но для обоих:

  • AnotherClass<T>

  • OtherClass<T>

является абсолютно необходимым , что такое универсальный тип, и решения будут приниматься во время выполнения на его основе.

Исходя из этого, тип T не является полностью произвольным, он может быть либо экземпляром иерархии классов T_1, либо иерархией классов T_2.

Как определено для класса, тип T эквивалентен Object, но я знаю, что эквивалентен либо T_1, либо T_2

Между сущностями T_1 и T_2 нет деловых отношений, поэтому я не делаю:

public interface BaseT { ... }
public class T_1 implements BaseT { ... }
public class T_2 implements BaseT { ... }

public class MyClass<T extends BaseT>

Разъяснение того, зачем использовать дженерики, если они не связаны:

Я определяю (пытаюсь) универсальный класс для обоих, потому что даже если они явно не связаны, существует неявное отношение, потому что и T_1, и T_2 могут и будут ассоциироваться с сущностью, представленной в MyClass

T будет одинаковым для MyClass, AnotherClass и OtherClass, так что в экземпляре будут только T_1 или T_2, но никогда оба одновременно.

У меня вопрос, какие альтернативы у меня есть здесь, кроме разработки интерфейс для MyClass и реализовать его для T_1 и T_2 ?.

Могу ли я достичь чего-то вроде MyClass<T extends T_1 or T_2>?

С уважением

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Возможно, это не совсем то, что вы ищете, но вы можете попробовать:

Создайте abstract универсальный класс, который реализует все:

public abstract class MyClass<T>
{
  AnotherClass<T> another;
  OtherClass<T> other;

  // Add any code needed

}

Затем создайте 2 общих класса для обоих базовых классов.
Эти классы могут быть пустыми, если весь код может быть реализован в абстрактном:

public class MyT1Class<T extends T_1> extends MyClass<T>
{
}

public class MyT2Class<T extends T_2> extends MyClass<T>
{
}
0 голосов
/ 06 сентября 2018

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

public class MyClass<T>
{
  // This factory-method creates an instance of the class if the correct type is passed
  // It throws a RuntimeException if not.
  public static <T> MyClass<T> getInstance(Class<T> type)
  {
    if (T_1.class.isAssignableFrom(type) || T_2.class.isAssignableFrom(type))
      return (new MyClass<T>());
    else
      throw new RuntimeException("Cannot create instance of MyClass<" + type.getName() + ">");
  }

  ...

}

Тогда

class T_3 extends T_2
{
}

....

MyClass<T_3> test_1;
test_1 = MyClass.getInstance(T_3.class); // This will succeed

MyClass<String> test_2;
test_2 = MyClass.getInstance(String.class); // Fails
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...