2009-12-16 7 views
0

В настоящее время я работаю над сервисным интерфейсом, который извлекает объекты домена на основе первичного ключа. Однако я чувствую, что неэффективно использую дженерики.java общие подстановочные знаки

объекты базы домена выглядеть следующим образом:

public interface DomainObject<PK extends Serializable> extends Serializable { 
    PK getID(); 
} 

Мой интерфейс сервиса выглядит следующим образом:

public interface LoadService<T extends DomainObject<PK>, PK extends Serializable> { 
    T load(PK ID); 
} 

Это работает, однако я должен указать тип PK в дженериков услуг, несмотря на то, тип PK уже известен внутри T. Есть ли способ, которым я могу обойтись, снова определить свой PK в интерфейсе LoadService? Что-то вроде:

LoadService<T extends DomainObject<? extends Serializable as PK> { ... } 

Помощь будет принята с благодарностью!

ответ

0

Попробуйте использовать несколько оценок для параметра типа, если T и расширяет DomainObject и реализует Serializable:

interface LoadService<T extends DomainObject<T> & Serializable> { 
} 
+0

попробовать? Где объяснение? – BalusC

1

Там нет никакого способа, чтобы избежать этого, потому что вы используете класс PK на «LoadService». Я имею в виду, что вы можете определить службы, как

interface LoadService<T extends DomainObject<?>> { 
    void store(T data); 
} 

Однако, это не вариант, если вы используете PK класса, потому что компилятор проверяет, что тип ПК совместим с типом объекта домена.

Другой вариант заключается в удалении параметр типа из DomainObject, т.е. выполнить следующие действия:

interface DomainObject extends Serializable { 
    Serializable getID(); 
} 
Смежные вопросы