Java 需要扩展类的枚举

Java 需要扩展类的枚举,java,enums,Java,Enums,我想要求扩展抽象类A的类提供枚举类型。我不需要约束类型本身,我只想确保它们提供一些枚举类型。例如,我有一个抽象类Animal,我想确保每个动物都有一套行为。我不需要约束这些行为或以任何方式创建主列表;我只是想确保所有动物都返回一个符号行为列表 理想情况下,我想说: public abstract class Animal { public List<Enum> getBehaviors(); } 公共抽象类动物{ 公共列表getBehaviors(); } 但这不会干净地编

我想要求扩展抽象类A的类提供枚举类型。我不需要约束类型本身,我只想确保它们提供一些枚举类型。例如,我有一个抽象类Animal,我想确保每个动物都有一套行为。我不需要约束这些行为或以任何方式创建主列表;我只是想确保所有动物都返回一个符号行为列表

理想情况下,我想说:

public abstract class Animal {
  public List<Enum> getBehaviors(); 
}
公共抽象类动物{
公共列表getBehaviors();
}
但这不会干净地编译


有什么想法吗?通过泛型来实现这一点会更好吗?

我有点困惑-如果您想要求所有
动物导出一组行为,那么理想情况下,您的目标是能够编写如下内容:

Animal a = /* .. create some subtype of Animal .. */
List</* ?? */> behaviors = a.getBehaviors();

然后,您可以让每个
Animal
类型定义
getBehaviors()
,以便它返回
Behavior
对象的列表。这为讨论行为提供了一个类型安全的框架,并有可能为每个行为添加更复杂的操作。

我有点困惑-如果您想要求所有动物导出一组行为,那么理想情况下,您的目标是能够编写如下内容:

Animal a = /* .. create some subtype of Animal .. */
List</* ?? */> behaviors = a.getBehaviors();
然后,您可以让每个
Animal
类型定义
getBehaviors()
,以便它返回
Behavior
对象的列表。这为讨论行为提供了一个类型安全的框架,并可能为每个行为添加更复杂的操作。

2我认为错误的地方

首先,您需要将该方法标记为抽象。您没有提供实现

第二,如果不希望出现警告,则应将枚举参数化<如果不需要进一步限制枚举,则code>Enum
应该足够了

然而,正如其他人所指出的,这可能不是你想要的。列举“行为”对你来说是无用的。一旦从getBehaviors()返回,它们就没有任何功能。您可以遍历它们并列出它们,但这只不过是一个
列表

我认为您需要一个
列表
,其中行为是一个为您做一些事情的界面

编辑:上面的科林在同一点上击败了我。

2件事我看错了

首先,您需要将该方法标记为抽象。您没有提供实现

第二,如果不希望出现警告,则应将枚举参数化<如果不需要进一步限制枚举,则code>Enum应该足够了

然而,正如其他人所指出的,这可能不是你想要的。列举“行为”对你来说是无用的。一旦从getBehaviors()返回,它们就没有任何功能。您可以遍历它们并列出它们,但这只不过是一个
列表

我认为您需要一个
列表
,其中行为是一个为您做一些事情的界面


编辑:上面的科林在同一点上击败了我。

好的,我将在这里展开我的评论

如果您想让您的
getBehaviors()
方法返回特定动物的行为列表,请让方法签名声明来自该方法的
list>
无法对其执行任何有用的操作(谁知道它是什么?)。该限制也不能帮助确保“行为”列表包含的对象类型实际上是“行为”,无论这在应用程序上下文中意味着什么。它们可以是一周中的几天,一年中的几个月,或者几乎任何东西

我猜你有一些
enum
s,比如
dogbhavior
(带有
BARK
BITE
等常量),你想确保列表中只允许这样的行为。这些行为收集在
enum
s中,这是一个实现细节。您应该做的是引入一个公共接口,将某些东西指定为
行为
。如果没有任何特定的方法与
行为关联,那么它可能只是一个标记接口(不定义任何方法)。否则,您可能希望它有一些方法,例如:

public interface Behavior {
  public String getName();
  public void doBehavior();
  // etc.
}
然后,您可以拥有一些实现此接口的
enum
s:

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;
  }
}
然后,“动物”可能看起来像:

public abstract class Animal {
  public abstract List<Behavior> getBehaviors(); 
}
公共抽象类动物{
公共抽象列表getBehaviors();
}

这对我来说更有意义。

好的,我将在这里扩大我的评论

public abstract class Animal {
  public List<? extends Enum<?>> getBehaviors(); 
}
如果您想让您的
getBehaviors()
方法返回特定动物的行为列表,请让方法签名声明来自该方法的
list>
无法对其执行任何有用的操作(谁知道它是什么?)。该限制也不能帮助确保“行为”列表包含的对象类型实际上是“行为”,无论这在应用程序上下文中意味着什么。它们可以是一周中的几天,一年中的几个月,或者几乎任何东西

我猜你有一些
enum
s,比如
dogbhavior
(带有
BARK
BITE
等常量),你想确保列表中只允许这样的行为。这些行为收集在
enum
s中,这是一个实现细节。您应该做的是引入一个公共接口,将某些东西指定为
行为
。如果没有任何特定的方法与
行为关联,那么它可能只是一个标记接口(不定义任何方法)。否则,您可能希望它有一些方法,例如:

public interface Behavior {
  public String getName();
  public void doBehavior();
  // etc.
}
然后,您可以拥有一些实现此接口的
enum
s:

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;
  }
}
然后,“动物”可能看起来像:

public abstract class Animal {
  public abstract List<Behavior> getBehaviors(); 
}
公共抽象类