2013-05-15 1 views
0

Можно ли указать несколько интерфейсов для общего типа в Java?(How?) Могу ли я параметризовать класс Java с несколькими ортогональными интерфейсами?

В частности, я работаю с существующей библиотекой (NASA World Wind), которая имеет ряд интерфейсов для своих объектов. У меня есть набор гетерогенных объектов, с которыми я работаю, которые я хотел бы сохранить в списке. Все объекты реализуют несколько интерфейсов, каждый из которых полезен мне (самоописательный Movable и Renderable, в частности).

Есть ли какой-то синтаксис, который мне не хватает, чтобы сделать это, или это запрещено? Должен ли я выбирать один и бросать другим?

+0

Возможный дубликат: http://stackoverflow.com/questions/5034231/how-to-use-multiple-upper -bounds-in-generics – torquestomp

+0

Это аналогичный, но не тот же вопрос. Это похоже на то, что он получит мне то, что мне нужно, но у него есть побочный эффект создания класса класса для этого типа; это не очень желательно. Нет ли способа сделать это иначе? – Zach

+0

Просто объявите общий тип на уровне метода, т. Е. 'Public void doStuff (вещь T) {' – torquestomp

ответ

3

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

Другим вариантом было бы указать на уровне декларации класса, что несколько верхних оценок возможно, и объявить атрибут списка, соответственно:

public class Foo<T extends Interface1 & Interface2> { 
    private List<T> theList; 
} 

Вышеприведенные работает до тех пор, как тип T реализует как интерфейсы.

+0

Невозможно определить общий интерфейс, если только Java не начнет вводить утиную печать (или, если только я не видела World Wind и не редактировал несколько десятков классов;). – Zach

2

Посмотрите FAQ Angelika Langer: What is the difference between a wildcard bound and a type parameter bound?.

Она приводит пример:

class Box< T extends Comparable<T> & Cloneable > 
    implements Comparable<Box<T>>, Cloneable {...} 

Здесь T extends Comparable<T> & Cloneable является параметром типа связан, и заявляет, что T сравнима и клонируемая. Общая форма:

TypeParameter extends Class & Interface1 & ... & InterfaceN 

После компиляции, когда типы стираются, параметр типа передает в первый тип. T выше стерты в Comparable<T>.

Итак, предположим, что вы пишете:

public class HurricanePattern<T extends Movable & Renderable> { 
    private T eye; 
    // ... 
} 

После типа стирания, тип времени выполнения eye является Movable.

0

Вы можете создать свой собственный интерфейс, как оболочка, которая проходит несколько интерфейсов:

public MyInterface extends Comparable,Serializable,... {}; 
public class Foo<T extends MyInterface> {...} 
+0

Это работает только в том случае, если вы можете редактировать все классы реализации (см. Другие ответы/комментарии). – Zach

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