Есть ли способ в java указать, что параметр типа универсального класса должен быть интерфейсом (а не только расширять его!)
Я хочу сделать следующее:
public class MyClass<X extends SomeInterface, Y extends SomeOtherClass & X>
Значение Y должно быть подклассом SomeOtherClass И реализовать X. То, что я сейчас получаю от компилятора,
Тип X не является интерфейсом; он не может быть указан как ограниченный параметр
Итак, как я могу сказать компилятору, что X всегда должен быть интерфейсом?
Edit:
Хорошо, думаю, я немного упростил свою проблему. Позвольте использовать мой фактический домен приложения, чтобы сделать его более понятным:
У меня есть API для представления диаграмм. A Диаграмма содержит объекты Node и Edge. Все эти три класса реализуют интерфейс Shape. Формы могут иметь дочерние фигуры, родительскую форму и принадлежать диаграмме.
Дело в том, что мне нужно сделать две версии этого API: один open-source с базовыми функциями и расширенный с большим количеством функций. Однако расширенный API должен предоставлять только те методы, которые возвращают расширенные типы (ExtendedDiagram, ExtendedNode, ExtendedEdge и (здесь возникает проблема) ExtendedShape).
Поэтому у меня есть что-то вроде этого:
/* BASIC CLASSES */
public interface Shape<X extends Shape<X,Y>, Y extends Diagram<X,Y>>{
public List<X> getChildShapes();
public X getParent();
public Y getDiagram();
...
}
public class Diagram<X extends Shape<X,Y>, Y extends Diagram<X,Y>> implements Shape<X,Y>{...}
public class Edge<X extends Shape<X,Y>, Y extends Diagram<X,Y>> implements Shape<X,Y>{...}
...
/* EXTENDED CLASSES */
public interface ExtendedShape extends Shape<ExtendedShape,ExtendedDiagram> { ... }
public class ExtendedDiagram extends Diagram<ExtendedShape,ExtenedDiagram> implements ExtendedShape { ... }
public class ExtendedEdge extends Edge<ExtendedShape,ExtenedDiagram> implements ExtendedShape { ... }
...
Расширенный API работает отлично, а базовый код API дает некоторые предупреждения, но основная проблема возникает при использовании базового API:
public class SomeImporter<X extends Shape<X,Y>, Y extends Diagram<X,Y>, E extends Edge<X,Y>>{
private Y diagram;
public void addNewEdge(E newEdge){
diagram.addChildShape(newEdge);
...
Эта последняя строка дает мне следующее предупреждение:
Метод addChildShape (X) в диаграмме типа не применим для аргументов (E)
Итак, теперь я просто хотел бы указать, что E также нужно реализовать X, и все будет хорошо - я надеюсь;)
Все это имеет смысл? Вы, ребята, знаете, как это сделать? Или существует даже лучший способ получить расширенный API с указанными ограничениями?Спасибо за прилипание ко мне, любая помощь очень ценится!