0

私のコードに似たサンプルコード。

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では 2 つのオブジェクトのいずれかになります。

次のように、インターフェイスに 2 つのメソッドを含めることもできると思います。

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

1 に答える 1

3

これはメソッドを正しくオーバーライドしていません:

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

型変数がありません。

正しく宣言するか:

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

または、クラス宣言を変更して、2 番目の型パラメーターを指定できるようにします。

public abstract class Client<B, A> {
  protected abstract Builder<B, A> getBuilder();
}
于 2018-07-24T10:30:14.237 に答える