「生の型」を静的フィールド/戻り値の型として使用するときにジェネリックスの警告を回避するにはどうすればよいですか?

GhostCat

これは基本的に昨日からのこの質問への続きです。「本当に」変更不可能なコレクションを構築するために、「最も一般的な方法」(私が考えることができる)を実装しようとしました。以下のコードは正常に機能します。ただし、警告(「rawtypes」および「unchecked」)を抑制する必要があります。

私はそれらの警告を避けるためにあらゆる種類のことを試みました。しかし、単に代替案を見つけることができませんでした。だから、私の質問は:私が抑制している警告を回避するためのクリーンな方法はありますか?

(私はこの他の質問を見ました;しかし、それが私のコードに本当に当てはまるかどうかは100%わかりません;そこでraw型を使用せずに「ジェネレーター」インターフェースを書き留めることができるかどうかわからないため)。

private interface Generator<T> {
    T generateNewInstance();
}

@SuppressWarnings("rawtypes")
private final static Generator ListGenerator = new Generator<List>() {
    @Override
    public List generateNewInstance() {
        return new ArrayList();
    }
};

public static <T> List<T> unmodifiableListBasedOnCloneOf(List<T> elements) {
    @SuppressWarnings("unchecked")
    List<T> newInstance = makeNewInstanceOf(elements.getClass(), ListGenerator);
    newInstance.addAll(elements);
    return Collections.unmodifiableList(newInstance);
}

private static <T> T makeNewInstanceOf(Class<T> incomingClass, Generator<T> fallbackGenerator) {
    try {
        return (T) incomingClass.newInstance();
    } catch (IllegalAccessException | InstantiationException e) {
        return fallbackGenerator.generateNewInstance();
    }
}
アンディターナー

のコピーをList<T>新しいに作成しArrayList<T>、その参照をインラインでに渡すとCollections.unmodifiableList、変更できないデコレータ以外はコピーにアクセスして変更できません。

    List<String> original = new ArrayList<>(Arrays.asList("Hello", "World"));

    // This simply decorates original, so updates to original are
    // reflected in this list.
    List<String> unmodifiableDecorator = Collections.unmodifiableList(original);

    // The reference to the new ArrayList is scoped to the call to
    // Collections.unmodifiableList, so nothing else can have a
    // reference to it.
    List<String> unmodifiableCopy =
        Collections.unmodifiableList(new ArrayList<>(original));

    System.out.println("Before clear:");
    System.out.println(original);
    System.out.println(unmodifiableDecorator);
    System.out.println(unmodifiableCopy);

    original.clear();

    System.out.println("After clear:");
    System.out.println(original);
    System.out.println(unmodifiableDecorator);
    System.out.println(unmodifiableCopy);

出力:

Before clear:
[Hello, World]
[Hello, World]
[Hello, World]
After clear:
[]
[]
[Hello, World]

したがってunmodifiableCopy、変更されることはなくunmodifiableList、デリゲートに参照を与えるように何らかの方法で説得できない限り、変更することはできません。

変更できないため、入力リストと同じ具象リストタイプのコピーを作成する必要はありません。ちょうどそれ作るArrayListそれはかなりで達成できる最高の読み取り性能を有しているので、List実装を。

したがって、警告や追加のクラスなしで、メソッドは次のようになります。

public static <T> List<T> unmodifiableListBasedOnCloneOf(List<T> elements) {
  return Collections.unmodifiableList(new ArrayList<>(elements));
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ