Хорошо, я собираюсь немного расширить свой комментарий здесь.
Если вы хотите, чтобы ваш метод getBehaviors()
возвращал список поведений для конкретного животного, заставляя сигнатуру метода объявить, чтоList<Enum<?>>
возвращается ничего , чтобы помочь вам.Клиент, который получает ваш List<Enum<?>>
от этого метода, не может сделать с ним ничего полезного (кто знает, что это такое?).Ограничение также ничего не делает для того, чтобы гарантировать, что тип объектов, содержащихся в списке поведения, на самом деле является «поведением», что бы это ни значило в контексте вашего приложения.Это могут быть дни недели, месяцы года или что угодно!
Я предполагаю, что у вас есть enum
с DogBehavior
(с константами, такими как BARK
, BITE
и т. Д.), И вы хотите убедиться, что в списке разрешено только такое поведение.Тот факт, что эти поведения собраны в enum
s, является деталью реализации.Что вы должны сделать, это ввести общий интерфейс, который обозначает что-то как Behavior
.Если нет конкретных методов, связанных с Behavior
, это может быть просто интерфейс маркера (который не определяет методы).В противном случае вы можете захотеть, чтобы он имел несколько методов, таких как:
public interface Behavior {
public String getName();
public void doBehavior();
// etc.
}
Затем у вас может быть несколько enum
с, которые реализуют этот интерфейс:
public enum DogBehavior implements Behavior {
BARK("Bark") {
public void doBehavior() {
// bark
}
},
// etc.
private final String name;
DogBehavior(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Затем 'Animal'может выглядеть так:
public abstract class Animal {
public abstract List<Behavior> getBehaviors();
}
Что имеет для меня больше смысла.