2016-07-22 11 views
7

chciałbym przechowywać typ zwany App wewnątrz zestawu. App musi być wylicznikiem, który implementuje interfejs App.Egzekwowanie realizatora interfejs być enum

Set<App> myApps; 

Mam zdefiniowany interfejs jak tak ...

interface App<T extends Enum<T>> {} 

To jest prawie pracy, na przykład, nie można tego zrobić ...

class MyClass implements Application<MyClass> {} 

jednak można zrób to ...

enum MyEnum implements Application<MyEnum> {} 
class Myclass implements Application<MyEnum> {} 

Co jest nie tak. Chcę tylko, aby wyliczenia były w stanie zaimplementować ten interfejs, jak mogę to wymusić?

+0

i dokładnie co błędów wiadomość dostajesz od kompilatora? Edytuj swój wpis, aby konsekwentnie wyświetlać * wszystkie * twoje deklaracje. –

+1

@MikeRobinson nie otrzymuje komunikatu o błędzie, to jest problem - chce, aby kompilator narzekał na ostatnią deklarację. ;) – Thomas

+0

@MikeRobinson ponownie przeczytaj pytanie. Nie ma błędu z kompilatora. OP chce tylko ograniczyć implementatora. – Mena

Odpowiedz

11

Zdefiniować metodę, która pozwala na dodawanie elementów w zestawie, ale zastosować ograniczenie dla tego parametru ...

public <E extends Enum<E> & IMyInterface> void addToSet(final E value) { } 

teraz po tym

addToSet(MyEnum.K) will compile 

ale

addToSet(new Myclass()) will NOT compile 
+2

Ładne obejście. – Mena

+1

Więc jest to właściwie ten sam typ parametru, z wyjątkiem części deklaracji metody, a nie deklaracji interfejsu - zgrabnie :) – Ogen

+0

Jaki będzie typ mojego zestawu? – Ogen

1

AFAIK Nie można wymusić implementatora interfejsu, aby mieć pewne właściwości, takie jak wyliczanie.

Jednak, w zależności od kodu i sposobu korzystania z tego interfejsu można zrobić to trudne dla kogoś, aby nie zrobić implementor enum:

  • Wymagaj T wdrożyć App<T> jak również, aby zapobiec przejściu jakiegokolwiek wyliczenia do deklaracja klasy (tj App<T extends Enum<T> & App<T>>)
  • użyć dodatkowych granice, jeśli to możliwe (patrz odpowiedź ΦXocę 웃 Пepeúpa za)
  • Dodaj metod, które są już realizowane przez Enum takich jak name(), ordinal() , getDeclaringClass() itp
  • Niech App<T ...> przedłużyć Comparable<T>.
  • Jeśli to możliwe, należy zadzwonić pod numer getClass().isEnum(), aby sprawdzić właściwość w czasie wykonywania. To nie jest idealne, ale są podobne rozwiązania, które są powszechnie stosowane, takie jak Collections.unmodifiableSet().
Powiązane problemy