首页 > 解决方案 > Java返回通用类型问题:未经检查的覆盖返回类型需要未经检查的转换

问题描述

嗨,我遇到了泛型类型问题,并从 IDE 收到警告。我有一个包含泛型类型值的类:

public class Result <OUT>{
    private final OUT outputValue;
    
    public OUT getOutputValue() {
        return outputValue;
    }
}

我有抽象类:

public abstract class CustomSource {

      public abstract <T> SourceFunction<T> getSource();
}

和扩展它的类:

public class OtherCustomSource extends CustomSource {

      @Override
      public SourceFunction<Result<MyEvent>> getSource() {
          ...some code...
      }
    }

IDE 给我警告:未经检查的覆盖返回类型需要未经检查的转换。我错过了什么?

标签: javagenerics

解决方案


public abstract <T> SourceFunction<T> getSource();

这不是你打算做出的承诺。这表示“对于每一个 T,我保证我可以获得类型的来源SourceFunction<T>。” 然后你出现了并将其子类化为

public SourceFunction<Result<MyEvent>> getSource();

上面写着“具体来说,我可以给你一个类型的来源Result<MyEvent>”,这是一个更弱的承诺。

如果您打算getSource只返回一种特定类型,那么您的泛型应该在CustomSource类上,而不是getSource函数上。

public abstract class CustomSource<T> {
  public abstract SourceFunction<T> getSource();
}

public class OtherCustomSource extends CustomSource<Result<MyEvent>> {

  @Override
  public SourceFunction<Result<MyEvent>> getSource() {
      ...some code...
  }
}

OtherCustomSource那么使用as a是有意义的CustomSource<Result<MyEvent>>(因为它可以获得 type 的来源Result<MyEvent>),但是例如将 aOtherCustomSource视为 a是没有意义的CustomSource<Integer>


推荐阅读