問題タブ [bounded-wildcard]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
6 に答える
73917 参照

java - Java ジェネリック (ワイルドカード)

Java の一般的なワイルドカードについていくつか質問があります。

  1. List<? extends T>とはどう違いList<? super T>ますか?

  2. 制限付きワイルドカードと制限なしワイルドカードとは?

0 投票する
2 に答える
1929 参照

java - ワイルドカードを使用した Java のジェネリック

Java の Generics、つまりワイルドカードの使用について質問があります。次のようなクラス GenClass の例があります。

私は別の単純なクラスを持っています:

次のテストクラスを作成しました。

ここで、ワイルドカードを使用してテスト クラスに次のように記述します。

の場所に:

コンパイラはこの新しいステートメントに問題はありませんが、

「メソッド(setVar())は引数(ExampleClass)には適用されません」と書かれています。このメッセージが表示されるのはなぜですか?

私がワイルドカードを使用した方法では、参照変数 c が GenClass 型になり、パラメーターとして任意のクラスを受け入れるようになると思いました-EI の代わりに任意のクラスがあります。これは単なる変数の宣言です。次に、それを初期化します

これは、タイプ ExampleClass のクラスをパラメータとして持つ、タイプ GenClass のオブジェクトを作成することを意味します。したがって、GenClass の E は ExampleClass になり、メソッド setVar() を使用して、引数として ExampleClass 型の何かを与えることができると思います。これは私の仮定と理解でしたが、Java はそれを好まないようで、正しくありません。どんなコメントでも大歓迎です、ありがとう。

0 投票する
2 に答える
1827 参照

java - この Java ジェネリック ワイルドカード エラーを修正するにはどうすればよいですか?

この質問では、TofuBeer は一般化された .xml の作成に問題がありましたIterableEnumeration

答えは、問題をほぼ解決したこのリンクhttp://www.javaspecialists.eu/archive/Issue107.htmlを指している jcrossley3 から来ました。

まだ一つ腑に落ちないことがあります。エリクソンが効果的に指摘したように、本当の問題は次のとおりです。

パラメーター化された型を構築するときにワイルドカードを指定することはできません

ただし、宣言でワイルドカードを削除しても機能しませんでした。

次のエラーが発生します。

しかし、JavaSpecialist のサンプルは機能します。

私が見つけることができる唯一の違いは、JavaSpecialists ブログでは、署名が次Enumerationの から来ていることです。Vector

失敗したものはZipFile、署名が次のとおりです。

最後に、これはすべて for-each コンストラクトとリンクで提案されている static make メソッドによって吸収されます

しかし!!そのニュースレターのポイントは、この問題を解決することではなく、ジェネリック型を指定する必要性を回避することでした。構文が見苦しいからです!!

だから..私の質問は:

何が起こっている?

IterableEnumerationパラメータEnumerationの型が である場合、なぜインスタンスを作成しないの<? extends SomeClass>ですか そして、make for-each 構造が問題を飲み込むのはなぜですか?!!!

なぜこれが機能するのですか:

しかし、これはうまくいきませんか?

以下は、TofuBeer の元のコードの (わずかに) 変更されたバージョンです。

理解したい!!

0 投票する
3 に答える
169104 参照

java - クラスとインターフェースを備えた Java ジェネリック - Together

Class オブジェクトが必要ですが、それが表すクラスが何であれ、強制的にクラス A を拡張し、インターフェイス B を実装したいと考えています。

できます:

または:

しかし、私は両方を行うことはできません。これを行う方法はありますか?

0 投票する
5 に答える
61537 参照

java - リスト

ジェネリックについて Java の質問があります。一般的なリストを宣言しました:

次に、いくつかの方法で、インスタンス化してそのリストに項目を追加しようとします。

myTypeInstanceはタイプのオブジェクトですMyType。コンパイルされません。それは言います:

List<capture#3-of ? 型の add(capture#3-of ? extends MyType) メソッド extends MyType> は引数 (MyType) には適用されません

何か案が?

0 投票する
1 に答える
1577 参照

java - ワイルドカードを使用した Java ジェネリック

この状況を修正する方法はあります (可能な限りシナリオを単純化しようとしました):

このシナリオは私に次のエラーを与えています:

ジェネリックでこれを行う方法があるかどうかはわかりませんが、

0 投票する
1 に答える
2830 参照

java - 戻り値の型で推測されるワイルドカード ジェネリック

Java は、多くの場合、引数に基づいてジェネリックを推論できます (たとえば、C# とは対照的に、戻り値の型に基づいても)。

Pair<T1, T2>適切な例: 値のペアを格納するだけで、次の方法で使用できるジェネリック クラスがあります。

メソッドofは次のようになります。

非常に素晴らしい。ただし、これは、ワイルドカードが必要な次のユースケースでは機能しなくなりました。

List.class(正しい型を作成するための明示的なキャストに注意してください。)

コードは次のエラーで失敗します (Eclipse によって提供されます)。

TestClass.Pair<Class<capture#1-of ?>,String>型の不一致: からに変換できませんTestClass.Pair<Class<?>,String>

ただし、コンストラクターを明示的に呼び出すと、期待どおりに機能します。

誰かがこの振る舞いを説明できますか? それは設計によるものですか?欲しいですか?私は何か間違ったことをしていますか、それとも設計上の欠陥やコンパイラのバグに遭遇しましたか?

勝手な推測: 「capture#1-of ?」どういうわけか、ワイルドカードがコンパイラによってオンザフライで埋められ、型が aClass<List>になり、変換が失敗することを暗示しているようです (からPair<Class<?>, String>Pair<Class<List>, String>)。これは正しいですか?これを回避する方法はありますか?


Pair完全を期すために、クラスの簡略化されたバージョンを次に示します。

0 投票する
2 に答える
444 参照

java - JavaGenericsの好奇心

AクラスBが実装するインターフェースがあります。

次の一般的な方法が機能します

しかし

私が出力をに向けているとき、しません(コンパイルエラー、タイプの不一致)

defaultCollectionFactory(int count)Bデフォルトのラベル付けスキームを使用して、sのコレクションを静的に提供します。

それがなぜであるかについての洞察はありますか?一般的なUとワイルドカードは同じことをしているようです。

0 投票する
2 に答える
5798 参照

java - Collections.sort() を使用してジェネリック List をソートするための Comparator オブジェクトを作成する

MyInterface を実装する任意のクラスのオブジェクトのリストに対して、一般的な並べ替えユーティリティ メソッドを実装しようとしています。Java API ( http://java.sun.com/javase/6/docs/api/java/util/Collections.html ) ごとに、Collections.sort() メソッドのシグネチャは次のとおりです。

ワイルドカード パラメーターを使用したリストが「プレーンな」パラメーター化されたリストを置き換えることができるかどうかはわかりませんが、次のことを試しました。

コンパイル時エラーが発生し、

だから、私はそれを次のように変更しました:

そして、コンパイルして動作します。良い説明はありますか?