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