我正在尝试在工厂类中创建一个方法。子类型的返回必须与声明的参数类型相同。
方法声明有效,但是当我尝试使用时,该方法没有返回预期的类型。
这是一个举例说明我的问题的课程:
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 interface Foo {
}
foo实现
public class FooImpl implements Foo {
}
FooParser
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
}
}
我正在使用NetBeans IDE 8.1,我收到以下错误:
不兼容的类型:CAP#1无法转换为FooImpl 其中CAP#1是一个frash类型变量 CAP#1扩展了对象的捕获?
有没有办法做这样的事情?
非常感谢提前
答案 0 :(得分:2)
仅因为<? extends Foo>
看起来与<? extends Foo>
相同并不代表它们是兼容的: - )
您可以尝试按如下方式重新表述:
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;
}