Можно ли сузить тип поля в классе Java, не делая сам содержащий класс универсальным?
Общий пример будет выглядеть примерно так:
abstract class MyClass {
//...
}
interface MyInterface {
//...
}
class MyConcreteClass<T extends MyClass & MyInterface> {
private T value;
}
Есть ли способ сделать следующее:
class MyConcreteClass {
private MyClass & MyInterface value;
}
Это по сути эквивалентно MyConcreteClass или необработанному типу MyConcreteClass. В моей реализации параметр типа будет изменяться в течение срока службы объекта (проклятая изменчивость! Он наложен на меня JPA!), Поэтому аннотация типа кажется несколько излишней.
Есть еще одно ограничение, о котором я забыл упомянуть. У нас также будет это:
class SubA extends MyClass
class SubB extends MyClass
class SubC extends MyClass
class SubSubA extends SubA implements MyInterface
class SubSubB extends SubB implements MyInterface
class SubSubC extends SubC implements MyInterface
Таким образом, простое объявление абстрактного подкласса MyClass, реализующего MyInterface, не является подходящим решением.
Кроме того, конечный тип поля должен быть конкретным типом, а не просто интерфейсом, представляющим пересечение, по той простой причине, что на сохраняемые JPA объекты не могут ссылаться их типы интерфейса. То есть постоянное поле в классе сущности JPA должно иметь тип примитива или конкретный тип сущности.