2016-07-22 2 views
7

Я хотел бы сохранить тип под номером App внутри набора. App должен быть перечислением, которое реализует интерфейс App.Обеспечение реализации интерфейса интерфейса как enum

Set<App> myApps; 

Я определил интерфейс, как так ...

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

Это почти работает, например, вы не можете это сделать ...

class MyClass implements Application<MyClass> {} 

Однако, вы можете это ...

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

Это не так. Я только хочу, чтобы перечисления могли реализовать этот интерфейс, как я могу обеспечить это?

+0

И какое именно сообщение об ошибке вы получаете от компилятора? Пожалуйста, отредактируйте свой пост, чтобы показать нам, последовательно, * все * ваших заявлений. –

+1

@MikeRobinson у него нет сообщения об ошибке, вот в чем проблема - он хочет, чтобы компилятор жаловался на последнее объявление. ;) – Thomas

+0

@MikeRobinson снова прочитал вопрос. Из компилятора нет ошибки. OP просто хочет ограничить реализацию. – Mena

ответ

11

Определить метод, который позволяет добавлять элементы в набор, НО использовать ограничение для этого параметра ...

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

Теперь после этого

addToSet(MyEnum.K) will compile 

но

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

Приятное обходное решение. – Mena

+1

Так что это почти тот же самый параметр параметров типа, что и часть декларации метода, а не декларация интерфейса - аккуратно :) – Ogen

+0

Каким будет тип моего набора? – Ogen

1

AFAIK невозможно обеспечить реализацию интерфейса интерфейса, чтобы иметь определенные свойства, такие как перечисление.

Однако, в зависимости от вашего кода и как использовать этот интерфейс, который вы можете сделать это трудно для кого-то, чтобы не сделать реализатор перечисления:

  • Требовать T реализовать App<T>, а также для предотвращения прохождения любого перечисления в объявление класса (т.е. App<T extends Enum<T> & App<T>>)
  • Используйте дополнительные границы, если это возможно (см ответ ΦXocę 웃 Пepeúpa в)
  • Добавить методы, которые уже реализованы на Enum, такие как name(), ordinal() , getDeclaringClass() и т. Д.
  • Let App<T ...> extend Comparable<T>.
  • По возможности позвоните getClass().isEnum(), чтобы проверить это свойство во время выполнения. Это не идеально, но есть похожие решения, которые обычно используются, такие как Collections.unmodifiableSet().
Смежные вопросы