2014-01-15 2 views
0

Я пытаюсь создать следующее перечисление.Параметр Java Bounded Type в Enum

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

Lead и Task классы как продлить SObject. Мое намерение состоит в том, чтобы в основном позволить клиентам иметь возможность использовать MyEnum.LEAD.isValid(lead) или MyEnum.TASK.isValid(task). Компилятор не должен пропускать другие типы.

Может кто-то помочь в понимании, почему это происходит.

Благодаря

+0

Есть ли у руководства и задачи общий интерфейс? Если нет, вам нужно будет определить метод с типом 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

Смежные вопросы