#java #generics #factory
Вопрос:
У меня есть универсальный класс GenericClass
:
public class GenericClasslt;T extends MySuperClassgt; { //... public void doSomething(T t) { //... } }
Это имеет несколько подклассов, которые выглядят следующим образом:
public class SubClassOfGeneric extends GenericClasslt;AnotherClassgt; { //... @Override public void doSomething(AnotherClass a) { //... } }
И AnotherClass
расширяется MySuperClass
.
Теперь мне нужна фабрика, которая создает экземпляры подклассов GenericClass
. Это код, который у меня есть прямо сейчас:
public class Factory { public GenericClass create(String type) { //SonarLint warning if(type == "SubClassOfGeneric") { return new SubClassOfGeneric(); //... } }
В этом коде я получаю предупреждение SonarLint: GenericClass is a raw type. References to generic type GenericClasslt;Tgt; should be parameterized.
Кроме того, у меня есть другая фабрика, которая создает экземпляры подклассов MySuperClass
. Я также получаю другую ошибку при фактическом создании объекта с помощью фабрики:
MySuperClass arg = new SuperClassFactory().create("AnotherClass"); Factory f = new Factory(); GenericClass g = f.create("SubClassOfGeneric"); g.doSomething(arg); // SonarLint error
Что показывает ошибку: Type Safety: The method doSomething(MySuperClass) belongs to the raw type GenericClass. References to generic type GenericClasslt;Tgt; should be parameterized.
Как я могу параметризовать общий класс, если я знаю конкретный тип только во время выполнения?