Есть ли способ в java, чтобы указать, что параметр типа универсального класса должен быть интерфейсом (а не просто расширять его!)
Я хочу сделать следующее:
public class MyClass<X extends SomeInterface, Y extends SomeOtherClass & X>
Это означает, что Y должен быть подклассом SomeOtherClass AND, чтобы реализовать X.
То, что я сейчас получаю от компилятора, это
Тип X не является интерфейсом; его нельзя указывать в качестве ограниченного параметра
Итак, как мне сказать компилятору, что X всегда должен быть интерфейсом?
Edit:
Хорошо, я немного упрощаю свою проблему. Давайте используем мой фактический домен приложения, чтобы сделать его более понятным:
У меня есть API для представления диаграмм. A Диаграмма содержит Узел и Edge объекты. Все эти три класса реализуют интерфейс Shape . Фигуры могут иметь дочерние фигуры, родительскую фигуру и принадлежать диаграмме.
Дело в том, что мне нужно сделать две версии этого API: одну с открытым исходным кодом только с основными функциями и расширенную с большим количеством функций. Однако расширенный 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) в типе Diagram не применим для аргументов (E)
Так что теперь я хотел бы указать, что E также должен реализовывать X, и все будет хорошо - я надеюсь;)
Имеет ли все это смысл? Ребята, вы знаете, как это сделать? Или есть даже лучший способ получить расширенный API с указанными ограничениями?
Спасибо, что остаетесь со мной, любая помощь очень ценится!