Метод перечисления Java возвращает универсальный тип, предоставленный в конструкторе? - PullRequest
0 голосов
/ 26 мая 2018

Я хотел бы иметь общий тип возвращаемого значения для метода enum getValue().Возвращаемый тип должен совпадать с типом, указанным в конструкторе перечисления.

public enum ParameterType
{
    NUMBER(int.class),
    TEXT(String.class);

    private Class<?> classType;

    ParameterType(Class<?> _clazz)
    {
        classType = _clazz;
    }

    public <T> T getValue()
    {
        String a = "i am a text";
        int b = 42;

        return classType.cast(a);
        //return classType.cast(b);
    }
}

Однако в этом случае возникает ошибка «невозможно преобразовать из захвата № 3? В T».Кроме того, невозможно предоставить общий тип «X» для самого перечисления, который мог бы использоваться для возвращаемых типов в случае классов.

Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Вы не можете сделать это с перечислением, потому что все значения в перечислении имеют одинаковый тип.

Чтобы сделать это, вы должны в основном построить «перечисление» вручную:

public final class ParameterType<T>
{
  public static final ParameterType<Integer> NUMBER = new ParameterType<>(42);
  public static final ParameterType<String> TEXT = new ParameterType<>("I am a text");

  private ParameterType(T value) {
    this.value = value;
  }

  public T getValue() { return value; }
}

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

0 голосов
/ 26 мая 2018

Не забудьте о кастинге.Переопределите getValue () для каждой константы перечисления.

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