基于参数化类型

时间:2016-02-24 02:06:04

标签: java generics

我试图根据其'的参数化类型检索一个类的实例。超类。我目前正在做的事情似乎应该有效,但出于某种原因,我遇到了汇编问题。

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

在这种情况下,TApple,所以不应该AppleHandler成为FruitHandler<T>的实例吗?

知道我在这里做错了吗?

1 个答案:

答案 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);