私は次のコードを持っています:
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ジェネリックの性質による。次のエラーが発生します。
タイプIDoWorkのメソッドget(capture#3-of?extends AbstractKey、capture#4-of?extends AbstractClass)は、引数(KeyA、ConcreteA)には適用できません。
それを行う別の方法はありますか?のタイプパラメータを省略した場合
IDoWork<? extends AbstractKey, ? extends AbstractClass> instance =...
タイプパラメータをから削除するとIDoWork
...動作しますが、警告が表示されます。それを修正する方法はありますか?インターフェイスから型パラメーターを削除できることはわかっていますが、それで問題は解決しますが、キャストを行う必要がないようにジェネリックスを用意すると便利です+各クラスが明確であるため、コードが明確になりますを使用します。Depencendyインジェクションは、私が使用しているコードベースでは利用できないため、問題外です。