2011-01-19 103 views
0

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

理想情况下,我想说:

public abstract class Animal { 
    public List<Enum> getBehaviors(); 
} 

但这不会顺利地编译。

任何想法?通过泛型方法来处理这个问题会更好吗?

+3

你为什么要这么做?某些东西是`enum`通常应该至多是一个实现细节。如果你想让你的`Animal`类返回一个行为列表,我会说它应该返回`List `,其中`Behavior`是一个接口。你可以有一些`enum`或者`enum`来实现`Behavior`,但是这个细节看起来并不重要。并且对行为列表包含的唯一限制是它包含的对象是某种“enum”对我来说没有意义......“DayOfWeek”可能不是行为。 – ColinD 2011-01-19 23:02:47

回答

2

好的,我打算在这里扩充我的评论。

如果您希望您的getBehaviors()方法返回的行为列表于特定动物,制作方法签名声明,则返回List<Enum<?>>什么来帮助你。从该方法获得List<Enum<?>>的客户无法做任何有用的事情(谁知道它是什么?)。限制也不会做任何事情来帮助确保行为列表中包含的对象的类型实际上是“行为”,无论在应用程序的上下文中如何。他们可能是一周中的几天,一年中的几个月或几乎任何事情!

什么我猜是,你有一些enum就像DogBehavior(与常量像BARKBITE等),要确保只有这些行为被允许在列表中。这些行为在enum中收集的事实是一个实现细节。你应该做的是引入一个通用接口,指定某种东西为Behavior。如果没有任何与Behavior相关的特定方法,它可能只是一个标记接口(不定义任何方法)。否则,你可能希望它有一些方法,像这样:

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(); 
} 

这对我来说更有意义。

2

我有点糊涂 - 如果你想要求所有Animal s到出口一组行为,那么你的理想目标是要能写出这样的事:

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

问题这里是如果你想让每个Animal为行为创建自己的枚举类型,除非明确指定代表它们的某种类型,否则没有统一的方式来讨论这些行为。换句话说,除非您在Animal界面中提供了所有Animal行为应与之相关的类型,否则不能填写上面的/* ?? */

一个办法是这样定义一个类:

public final class Behavior { 
    private final String name; 

    public Behavior(String name) { 
     this.name = name; 
    } 
    public String getBehaviorName() { 
     return name; 
    } 
    /* ... etc. ... */ 
} 

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

1

2我看错的东西。

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

其次,如果您不需要警告,Enum应该被参数化。如果你不需要进一步限制Enum,那么Enum<?>就足够了。

但是,正如其他人所指出的,这可能不是你想要的。 “行为”的一个枚举对你来说毫无用处。他们没有从getBehaviors()返回的功能。你可以遍历它们并列出它们,但这只是一个List<String>

我认为你想要一个List<Behavior>行为是一个接口,为你做些事情。

编辑:ColinD上面击败了我在同一点上的拳。

0
public abstract class Animal { 
    public List<? extends Enum<?>> getBehaviors(); 
}