2014-01-15 90 views
0

我正在尝试创建以下枚举。Java中的枚举类型参数

public enum MyEnum{ 
    LEAD { 
     @Override 
     public boolean isValid(Lead lead) { //compile error, asks to retain type as T 
     } 
    }, 
    TASK { 
     @Override 
     public boolean isValid(Task task) { //compile error, asks to retain type as T 
     } 
    }; 

    public abstract <T extends SObject> boolean isValid(T object); 
} 

LeadTask类都延伸SObject。我的意图是基本上让客户能够使用MyEnum.LEAD.isValid(lead)MyEnum.TASK.isValid(task)。编译器不应该允许传递其他类型。

有人可以帮助理解为什么会发生这种情况。

谢谢

+0

Lead和Task是否有共同的界面?如果不是,则需要使用Object类型来定义方法。 – JustinKSU

+0

@JustinKSU,他们都扩展了'SObject'。 – RandomQuestion

+0

为什么在该调用模式中使用'enum'?为什么不在“Task”和'Lead'上添加一个静态方法就像'Lead.isValid(lead)'?甚至是非静态的,只需调用'lead.isValid()'? –

回答

2

您需要用相同的泛型方法覆盖泛型方法。如果你想做你在问什么,你需要一个 - enum不能。

问题的关键是,我用类引用参考enum - 即

final MyEnum myenum = MyEnum.LEAD; 

现在,如果我叫myenum.isValid()我应该能够任何SObject叫它你abstract方法定义。
您拥有的通用方法定义实际上没有做任何事情。它所做的只是捕获SObject中传递的类型并将其存储为T。泛型方法常用来绑在一起类型的参数,例如

<T> void compare(Collection<T> coll, Comparator<T> comparator); 

这里我们不在乎什么T实际上是 - 所有我们需要的是,Comparator可以比较是在Collection的事情。

你在想什么的是一个通用类,类似:

interface MyIface<T> { 
    boolean isValid(T object); 
} 

然后

class LeadValid implements MyIface<Lead> { 
    public boolean isValid(Lead object){} 
} 

你看不同的是,你将有一个MyIface<Lead> - 你必须申报类型MyIface。在enum的情况下,你只有一个MyEnum

+0

感谢您解释为什么它不起作用。我有这些通用类,但想避免创建额外的类,并想到使用我现有的枚举。 – RandomQuestion