摆脱未检查的覆盖:返回类型需要未检查的转换

时间:2018-07-24 10:26:34

标签: java generics unchecked-conversion

与我的代码相似的示例代码。

public interface Builder<B, A> {
  B build(A a);
}

public class ClientBuilder implements Builder<String, Integer> {
  @Override
  public String build(Integer i) {
    return i.toString();
  }
}

public abstract class Client<B> {
  protected abstract <A> Builder<B, A> getBuilder();
}

public class ClientClient extends Client<String> {

  @Override
  protected Builder<String, Integer> getBuilder() {
    return null;
  }
}

在我的ClientClient类中,我收到一条警告,内容如下:

Unchecked overriding: return type requires unchecked conversion.Found 'Builder<java.lang.String,java.lang.Integer>', required 'Builder<java.lang.String,A>

有什么办法可以解决这个错误?
我可以使用@SuppressWarnings("unchecked"),但是感觉不对。

在我的示例中,A始终是Integer,但在我的真实代码中,A可以是两个对象之一。

我想我的界面中也可以有两个方法,如下所示:

public interface Builder<B> {
  B build(Integer i);
  B build(String s);
}

1 个答案:

答案 0 :(得分:3)

这不能正确覆盖方法:

protected Builder<String, Integer> getBuilder() {
    return null;
}

您缺少类型变量。

可以正确声明:

protected <A> Builder<String, A> getBuilder() {
    return null;
}

或更改类声明以允许您提供第二个类型参数:

public abstract class Client<B, A> {
  protected abstract Builder<B, A> getBuilder();
}