Интерфейс Java для обеспечения определения типа перечисления - PullRequest
2 голосов
/ 09 июня 2011

Мне нужно определить интерфейс, который переопределяет что-то вроде хэш-набора.

Итак, у меня есть методы типа get (байт-ключ). Поскольку я не могу использовать описательные ключи, такие как String, я ищу общий способ определения ключей, доступных в рамках некоторой реализации интерфейса. Я думаю об использовании enum для этого. Но возможно ли форсировать определение такого Enum в Интерфейсе?

Чтобы прояснить, что я имею в виду, давайте рассмотрим пример класса, реализующего Интерфейс:

public class ByteHashsetImpl implements ByteHashset {
    public enum Key {
        STATE_A,
        STATE_B,
        STATE_C;
    }

    public enum Value {
        VALUE_A,
        VALUE_B,
        VALUE_C;
    }

    public void get(Key k) {
        /**/
    }

}

Я хочу убедиться, что каждая реализация определяет и использует свои собственные перечисления, называемые ключом и значением. Это позволило бы получить доступ к ключу / значениям, используя что-то вроде ByteHashsetImpl.Key для каждой реализации интерфейса.

Возможно ли это вообще или есть еще один вариант, помимо неформального определения, например, кодирования?

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Как предлагает Йоахим Зауэр , вы можете иметь Enum аргументы типа:

public interface MyMap<K extends Enum<K>, V extends Enum<V>> {

    public V get(K key);

}

Тогда вы можете иметь:

public enum StateKeys {

    STATE_A,
    STATE_B,
    STATE_C;

}

и

public enum StateValues {

    VALUE_A,
    VALUE_B,
    VALUE_C;

}

и наконец

public class MyStateMap implements MyMap<StateKeys, StateValues> {

    @Override
    public StateValues get(StateKeys key) {
        if (key == StateKeys.STATE_A)
            return StateValues.VALUE_A;
        else if (key == StateKeys.STATE_B)
            return StateValues.VALUE_B;
        else if (key == StateKeys.STATE_C)
            return StateValues.VALUE_C;
        else
            throw new IllegalArgumentException("illegal key " + key);
    }

}
3 голосов
/ 09 июня 2011

Вы не можете принудительно создать создание таких перечислений, но вы можете заставить аргумент типа быть перечислением:

public interface Frobnicator<E extends Enum<E>> {
  void frobnicate(E value);
}


enum Bar {
  X, Y;
}

class BarFrobnicator implements Frobnicator<Bar> {
  @Override
  public void frobnicate(Bar value) {
    // do stuff
  }
}

В этом случае Frobnicator может просто повторно использовать существующий класс enum, но E в Frobnicator всегда будет иметь тип enum.

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