0

コードをコンパイルすると 4 つの警告が表示されますが、それらを非表示にするにはどうすればよいですか? (@SuppressWarnings の意味ではありません)

PS: 明らかに、これは以前に尋ねられたに違いありませんが、見つからないか、適用できません。


出力

warning: [unchecked] unchecked call to BaseWorker(C) as a member of the raw type BaseWorker
[warn] return new BaseWorker(this);

warning: [unchecked] unchecked conversion
[warn] found   : com.crashnote.BaseWorker
[warn] required: com.crashnote.BaseWorker<C>
[warn] return new BaseWorker(this);

warning: [unchecked] unchecked call to SubWorker(C) as a member of the raw type SubWorker
[warn] return new SubWorker(this);

warning: [unchecked] unchecked conversion
[warn] found   : com.crashnote.SubWorker
[warn] required: com.crashnote.SubWorker<C>
[warn] return new SubWorker(this);

ソースコード

BaseConfig : BaseWorker をインスタンス化します

public class BaseConfig<C extends BaseConfig> {

    public BaseConfig(final Object c) {
    }

    public BaseWorker<C> getWorker() {
        return new BaseWorker(this);
    }
}

ベースワーカー

public class BaseWorker<C extends BaseConfig> {

    public BaseWorker(final C config) {
    }
}

SubConfig : サブワーカーをインスタンス化します

class SubConfig<C extends SubConfig> extends BaseConfig<C> {

    public SubConfig(final Object c) {
        super(c);
    }

    @Override
    public SubWorker<C> getWorker() {
        return new SubWorker(this);
    }
}

SubWorker : SubWorker から継承

public class SubWorker<C extends BaseConfig> extends BaseWorker<C> {

      public SubWorker(final C config) {
          super(config);
      }  
}

編集

提供された解決策を試しましたが、何らかの理由で失敗しました。

A)

return new BaseWorker<BaseConfig>(this);

結果は

incompatible types
[error] found   : BaseWorker<BaseConfig>
[error] required: BaseWorker<C>
[error] return new BaseWorker<BaseConfig>(this);

B)

return new BaseWorker<C>(this);

結果は

cannot find symbol
[error] symbol  : constructor BaseWorker(BaseConfig<C>)
[error] location: class BaseWorker<C>
[error] return new BaseWorker<C>(this);

うーん、私は何か間違ったことをしているのかもしれません。ちなみに、これは Java 6 です。

4

3 に答える 3

3

プレーンに返す代わりに

return new BaseWorker(this);

BaseWorkerクラスがジェネリックとして定義されている ため、ジェネリックにします。

return new BaseWorker<C>(this);

にも同じルールが適用されSubWorkerます。

return new SubWorker<C>(this);

アップデート:

例外メッセージに基づいて、コンストラクターにもジェネリックがありません。

于 2012-11-07T15:08:33.217 に答える
2

試す

 return new BaseWorker<C>(this);

 return new SubWorker<C>(this);
于 2012-11-07T15:09:24.433 に答える
0

さて、私のコードに答えを適用した後、それらが実際に間違っていることがわかりました。これがうまくいくようです。

BaseConfigに print() メソッドが追加され (後で正しい型であることを確認するため)、BaseWorkerのインスタンス化にジェネリックが追加されます。

public class BaseConfig<C extends BaseConfig> {

    public BaseConfig(final Object c) {
    }

    public BaseWorker<C> getWorker() {
        return new BaseWorker<C>(this);
    }

    public void print() {
        //
    }
}

ここが興味深いところです。BaseWorkerにはジェネリックを持つコンストラクターがあります。これは完全に冗長に思えますが、私が見つけた唯一の方法でした。単に記述<C>すると、クラスのジェネリックに加えて新しい「ローカル」ジェネリックのように見え、コンパイラ エラーが発生します ( cannot find symbol: method print())。

public class BaseWorker<C extends BaseConfig> {

    public <C extends BaseConfig> BaseWorker(final C config) {
        config.print();
    }
}

それに応じて、 SubConfigSubWorkerが変更されます。

PS: これがまったくナンセンスな場合は、教えてください :)

于 2012-11-07T16:36:28.340 に答える