У меня есть общий абстрактный класс Factory<T>
с методом createBoxedInstance()
, который возвращает экземпляры T
, созданные реализациями createInstance()
, обернутыми в общий контейнер Box<T>
.
abstract class Factory<T> {
abstract T createInstance();
public final Box<T> createBoxedInstance() {
return new Box<T>(createInstance());
}
public final class Box<T> {
public final T content;
public Box(T content) {
this.content = content;
}
}
}
В некоторых моментах мне нужен контейнер типа Box<S>
, где S
является предком T
.Можно ли сделать createBoxedInstance()
сам по себе универсальным, чтобы он возвращал экземпляры Box<S>
, где вызывающий выбрал S
?К сожалению, определение функции следующим образом не работает, поскольку параметр типа не может быть объявлен с использованием ключевого слова super , только используется .
public final <S super T> Box<S> createBoxedInstance() {
return new Box<S>(createInstance());
}
Единственная альтернатива, которую я вижу, - это сделать все места, где требуется экземпляр Box<S>
accept Box<? extends S>
, что делает элемент содержимого контейнера назначаемым S
.
Есть ли способ обойти это безпереназначить экземпляры T
в контейнеры типа Box<S>
?(Я знаю, что мог бы просто бросить Box<T>
на Box<S>
, но я чувствовал бы себя очень, очень виновным.)