Я очень новичок в Java-генераторах и потратил непомерное количество времени на поиск подходящего решения (если оно есть).Шаблон общих методов в Java
Я пытаюсь разработать адаптеры, которые обрабатывают объекты определенного типа класса. Как описано ниже, класс CAdapter обрабатывает только объекты CClass. Я пытаюсь предоставить абстрактный общий адаптер, который обрабатывает большую часть работы (подобно сборкам Java, таким как LinkedList). Затем я предоставляю конкретную реализацию адаптера для каждого типа, который должен поддерживаться.
// Classes
public interface AInterface {
public String toString();
}
public class BClass extends AInterface {
public String toString() { return "BClass "; }
}
public class CClass extends AInterface {
public String toString() { return "CClass"; }
}
// Adapters
public interface AdapterInterface<T extends AInterface> {
public T getInterface();
}
public class BAdapter implements AdapterInterface<BClass> {
private BClass aInterface = null;
public BClass getInterface() { return aInterface; }
}
public class CAdapter implements AdapterInterface<CClass> {
private CClass aInterface = null;
public CClass getInterface() { return aInterface; }
}
Во-первых, я прочитал, что предоставление конкретной реализации такого универсального адаптера неодобрением (что-то о Боге убийство котенка)! Может быть, кто-то может расширить это?
Во-вторых, у меня возникла проблема с динамическим созданием экземпляра адаптера и отсутствием компилятора Java. Например, у меня есть метод:
public <T extends AInterface> AdapterInterface<T> getAdapter(String type) {
AdapterInterface<T> result = null;
if (type.equals("C") {
result = new CAdapter();
}
return result;
}
Конечно, компилятор будет жаловаться на несоответствие CAdapter. Для любого типа объекта AInterface я хотел бы иметь возможность загрузить правильный адаптер и обработать его соответствующим образом. Я не понимаю, что такое фабрика, чтобы добиться этого.
Любые мысли были бы весьма благодарны.
Вы вызываете foo. getAdapter (C)? В противном случае T несвязано. Более распространенным шаблоном будет публикация AdapterInterface getAdapter (класс clazz); –
Nialscorva
Вам придется придать некоторый контекст убивающей части котенка. Мы не можем сказать вам, если кто-то в Интернете прав или не прав, если мы не знаем, что он на самом деле сказал. – millimoose
@Nialscorva Это не имеет большого значения. Система типов не может доказать ограничение, предоставляете ли вы токен типа или нет. Символы типа полезны, когда подпись метода похожа на ' T getWhateverOfType (класс )' из-за 'Class.newInstance()', 'Class.cast()' et al. Они не полезны, если вы не имеете дело с экземплярами данного класса. –
millimoose