我试图根据其'的参数化类型检索一个类的实例。超类。我目前正在做的事情似乎应该有效,但出于某种原因,我遇到了汇编问题。
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>
的实例吗?
知道我在这里做错了吗?
答案 0 :(得分:0)
您只需cast
将结果FruitHandler<T>
发送给return (FruitHandler<T>) new AppleHandler();
。这应该这样做:
<T>
问题在于编译器不能知道那个<T>
会是什么;因此,当您实际返回Apple
时,它希望返回 if (clazz == Apple.class) {
FruitHandler fh = new AppleHandler();
return fh;
}
类型。
要回答您的评论,有一种方法可以避免将显式转换为返回类型
MenuItemCompat.setActionView(item, R.layout.action_progressbar);