Java 声明方法从声明类型返回泛型子类型

Java 声明方法从声明类型返回泛型子类型,java,generics,nested-generics,Java,Generics,Nested Generics,我试图在工厂类中创建一个方法。子类型的返回必须与声明的参数的类型相同 方法声明有效,但当我尝试使用时,该方法没有返回预期的类型 下面是一个例子来说明我的问题: import java.util.HashMap; /** * * @author Marcos Martinewski Alves */ public class FooParserFactory { private static final HashMap<Class<? extends Foo>,

我试图在工厂类中创建一个方法。子类型的返回必须与声明的参数的类型相同

方法声明有效,但当我尝试使用时,该方法没有返回预期的类型

下面是一个例子来说明我的问题:

import java.util.HashMap;

/**
 *
 * @author Marcos Martinewski Alves
 */
public class FooParserFactory {

    private static final HashMap<Class<? extends Foo>, FooParser<? extends Foo>> fooParsers = new HashMap();

    public static FooParser<? extends Foo> getFooParser(Class<? extends Foo> cls) {
        initParsers();
        FooParser<? extends Foo>  parser = fooParsers.get(cls);
        if (parser == null) {
            throw new RuntimeException("FooParser not found for class "+cls);
        }
        return parser;
    }

    private static void initParsers() {
        if (fooParsers.isEmpty()) {
            // populate fooParsers hashmap
        }
    }

}
foo实现

public class FooImpl implements Foo {

}
FooParser

public interface FooParser<T extends Foo> {

    public T parse(Object object);

}
我正在使用NetBeans IDE 8.1,出现以下错误:

不兼容类型:CAP#1无法转换为FooImpl 其中CAP#1是frash类型变量 CAP#1将对象从捕获扩展到

有没有办法做到这一点

因为

public interface FooParser<T extends Foo> {

    public T parse(Object object);

}
public class FooParserUsage {

    public void useFooParser(Object source) {
        FooImpl fooImpl = FooParserFactory.getFooParser(FooImpl.class).parse(source); // here
    }

}
public static <T extends Foo> FooParser<T> getFooParser(Class<T> cls) {
//            ^^^^^^^^^^^^^^^           ^                     ^
//            introduce a type       now these two are "compatible"
//            variable
    initParsers();

    // This line will however require a cast. Judge for yourself if it is safe.
    FooParser<T> parser = (FooParser<T>) fooParsers.get(cls);
    if (parser == null) {
        throw new RuntimeException("FooParser not found for class " + cls);
    }
    return parser;
}