我试图根据其超类的参数化类型来检索该类的实例。我目前的工作方式似乎应该可以,但是由于某种原因,我遇到了编译问题。

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>的实例吗?

知道我在这里做错了什么吗?

最佳答案

您只需要将结果castFruitHandler<T>。应该这样做:

return (FruitHandler<T>) new AppleHandler();

问题在于,编译器此时无法知道<T>是什么。因此它实际上在返回<T>时期望返回Apple类型。

为了回答您的评论,有一种方法可以避免显式转换为返回类型

        if (clazz == Apple.class) {
            FruitHandler fh =  new AppleHandler();
            return  fh;
        }

10-06 05:12
查看更多