20

私はJavaが初めてです。この ドキュメントでは、ワイルドカードを使用するユースケースとしてこれを示しています

static void printCollection(Collection c) {
    Iterator i = c.iterator();
    for (int k = 0; k < c.size(); k++) {
        System.out.println(i.next());
    }
}

これが彼らの解決策です:

static void printCollection(Collection<?> c) {
    for (Object e : c) {
        System.out.println(e);
    }
}

しかし、ワイルドカードなしで同じことができます:

static <T> void printCollection(Collection<T> c) {
    Iterator i = c.iterator();
    for (int k = 0; k < c.size(); k++) {
        System.out.println(i.next());
    }
}

通常のジェネリックは機能しないが、ワイルドカードは機能する簡単なユースケースを誰かに教えてもらえますか?

更新: ここの回答Java Generics でいつワイルドカードを使用するのですか? ワイルドカードの必要性を教えないでください。実際にはその逆です。

4

3 に答える 3

0

リストを例に取ります。

  • List<?>の親クラスになることができますList<A>

例えば、

List<B> bList = new ArrayList<>(); // B is a class defined in advance
List<?> list = bList;

<T>この状況では決して使用できません。

  • <?>ワイルドカード キャプチャがあります。

ここ、

  void foo(List<?> i) {
        i.set(0, i.get(0));
    }

上記のコードはコンパイルできません。あなたはそれを修正することができます:

    void foo(List<?> i) {
        fooHelper(i);
    }

    // wildcard can be captured through type inference.
    private <T> void fooHelper(List<T> l) {
        l.set(0, l.get(0));
    }

詳細については、http://docs.oracle.com/javase/tutorial/java/generics/capture.htmlを参照してください。

現在は2つしか思い浮かびませんが、後で更新する可能性があります。

于 2015-04-25T04:22:43.003 に答える