我试图根据其超类的参数化类型来检索该类的实例。我目前的工作方式似乎应该可以,但是由于某种原因,我遇到了编译问题。
class Fruit {}
class Apple extends Fruit {}
public interface FruitHandler<T> {
void handle(T handle);
}
public class AppleHandler implements FruitHandler<Apple> {
@Override public void handle(Apple apple) {
System.out.println("Handling apple...");
}
}
以下是存在问题的工厂类:
public class FruitHandlerFactory {
public <T> FruitHandler<T> getInstance(Class<T> clazz) {
if (clazz == Apple.class) {
// This line is causing the error
return new AppleHandler();
}
return null;
}
}
我收到以下编译错误:
Error:(7, 14) java: incompatible types
required: FruitHandler<T>
found: AppleHandler
在这种情况下,
T
是Apple
,所以AppleHandler
不应是FruitHandler<T>
的实例吗?知道我在这里做错了什么吗?
最佳答案
您只需要将结果cast
到FruitHandler<T>
。应该这样做:return (FruitHandler<T>) new AppleHandler();
问题在于,编译器此时无法知道<T>
是什么。因此它实际上在返回<T>
时期望返回Apple
类型。
为了回答您的评论,有一种方法可以避免显式转换为返回类型
if (clazz == Apple.class) {
FruitHandler fh = new AppleHandler();
return fh;
}