У меня есть следующий код:Java дженериков и интерфейсы, используя типы в качестве параметров метода
public interface IDoWork<K extends AbstractKey,V extends AbstractClass> {
V obtain(K key, V value);
}
public class AbstractKey {
String id;
}
public class AbstractClass {
String name;
}
public class ConcreteA extends AbstractClass {
String attributeA;
}
public class DoWorkA implements IDoWork<KeyA, ConcreteA> {
private static final DoWorkA INSTANCE = new DoWorkA();
public static DoWorkA getInstance() {
return INSTANCE;
}
@Override
public ConcreteA obtain(KeyA k, ConcreteA v) {
//do something in real life
return null;
}
}
public class Main {
public static void main(String[] args){
KeyA a = new KeyA();
ConcreteA c = new ConcreteA();
IDoWork<? extends AbstractKey, ? extends AbstractClass> instance =
WorkFactory.getInstance().obtainInstance(a);
instance.obtain(a, c);
}
}
public class WorkFactory {
private static final WorkFactory INSTANCE = new WorkFactory();
public static WorkFactory getInstance() {
return INSTANCE;
}
public IDoWork<? extends AbstractKey, ? extends AbstractClass> obtainInstance(AbstractKey key){
if(key instanceof KeyA){
return DoWorkA.getInstance();
}
throw new IllegalArgumentException("Case not handled");
}
}
В следующем коде:
KeyA a = new KeyA();
ConcreteA c = new ConcreteA();
IDoWork<? extends AbstractKey, ? extends AbstractClass> instance = WorkFactory.getInstance().obtainInstance(a);
instance.obtain(a, c);
Эта строка не компилируется:
instance.obtain(a, c);
из-за природы дженериков Java. Я получаю следующую ошибку:
The method obtain(capture#3-of ? extends AbstractKey, capture#4-of ? extends AbstractClass) in the type IDoWork is not applicable for the arguments (KeyA, ConcreteA)
Есть ли другой способ сделать это? Если опустить параметры типа в
IDoWork<? extends AbstractKey, ? extends AbstractClass> instance =...
Если удалить параметры типа из IDoWork
... он работает, но я получаю предупреждение. Есть ли способ исправить это? Я знаю, что я могу удалить параметры типа из интерфейса, и это решит проблему, но я считаю нужным иметь генераторы, чтобы не делать кастинг +, это привносит ясность в код, так как ясно, что каждый класс использует. Depencendy инъекция из вопроса, поскольку он не доступен в кодовом я в
Вы не можете использовать: 'IDoWork instance = WorkFactory.getInstance(). GetInstance (a);'? Что такое код в «WorkFactory» - что он связывает в качестве аргументов общего типа? –
Я только что добавил класс WorkFactory. Спасибо –