Я знаю, что есть много похожих вопросов, но мне не повезло найти хорошее и чистое решение, если это вообще возможно.
Я реализую универсальный интерфейс с подклассами абстрактного типа. Проблема в том, что когда я их вызываю, я должен либо выполнять приведение типа в switch / case, либо приведение типа в каждом методе внутри реализации интерфейса, и я не могу придумать хороший и чистый подход ... Я лучше просто напишу вниз короткий пример.
// An abstract type with 2 implementations...
public abstract class ObjTypeAbstract {}
public class ObjType extends ObjTypeAbstract {}
public class ScriptType extends ObjTypeAbstract {}
Теперь процессор для обоих типов с интерфейсом
interface ProcessorInterface<T extends ObjTypeAbstract> {
public void abcMethod(T obj);
}
public class ObjProcessor implements ProcessorInterface<ObjType> {
public void abcMethod(ObjType obj) {}
}
public class ScriptProcessor implements ProcessorInterface<ScriptType> {
public void abcMethod(ScriptType obj) {}
}
То, с чем я борюсь, это способ вызова этих процессоров на основе ObjAbstractType. У меня есть один класс, серверы в качестве промежуточного ПО или как мне это назвать.
Идея состояла в том, чтобы просто получить нужный процессор с помощью одного переключателя / корпуса:
public class Processor {
private ProcessorInterface objProcessor = new ObjProcessor();
private ProcessorInterface scriptProcessor = new ScriptProcessor();
public methodAbc(ObjAbstractType obj) {
getProcessor(obj).abcMethod(obj);
}
private ProcessorInterface getProcessor(ObjAbstractType obj) {
if (obj instanceof ObjType) {
return objectProcessor;
} else if (obj instanceof ScriptType) {
return scriptProcessor;
}
return nullProcessor;
}
}
Это то, что я хотел бы иметь, он также заботится о приведении типа objAbstract к фактическому типу для abcMethod, проблема в том, что это приводит к предупреждению RawType, которое не нарушает код, но я бы хотел избавиться от этого.
И вот где я застрял ... потому что, если я приведу процессоры к определенному типу, как это:
private ProcessorInterface<ObjType> objProcessor = new ObjProcessor();
private ProcessorInterface<ScriptType> scriptProcessor = new ScriptProcessor();
Я не смогу вернуть абстрактный метод из метода getProcessor, поэтому мне пришлось бы реализовать эти интерфейсы с ObjAbstractType со всеми его методами и иметь приведение типов во всех методах каждого процессора, например:
public class ScriptProcessor implements ProcessorInterface<ObjAbstractType> {
public void abcMethod(ObjAbstractType obj) {
ScriptType scr = (ScriptType) obj;
}
}
Другое решение могло бы иметь переключатель / регистр внутри класса промежуточного программного обеспечения Processor и приводить в него ObjAbstractType, но мне пришлось бы написать этот переключатель внутри abcMethod и всех остальных, либо из метода getProcessor, который возвращает и Processor, и приведенный ObjType .. так что я должен был бы вернуть некоторые dto, содержащие оба : /
Есть ли у вас какие-либо идеи / шаблоны, которые могут помочь мне избавиться от предупреждения о вызовах RawType, не расширяя код большим количеством приведений типа switch / case или type?
Желаю тебе хорошего дня, и я буду рад любой дискуссии, Дэвид.