我有以下代码:
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 类型中的方法 gain(capture#3-of ? extends AbstractKey, capture#4-of ? extends AbstractClass) 不适用于参数 (KeyA, ConcreteA)
还有另一种方法吗?如果省略中的类型参数
IDoWork<? extends AbstractKey, ? extends AbstractClass> instance =...
如果我从IDoWork... 中删除类型参数,它可以工作,但我会收到警告。有没有办法解决这个问题。?我知道我可以从接口中删除类型参数,这将解决问题,但我发现拥有泛型以便不必进行强制转换很方便 + 它使代码更加清晰,因为可以清楚地看到每个类用途。依赖注入是毫无疑问的,因为它在我所在的代码库中不可用。