何に相当するJavaワイルドカード、C#のジェネリック医薬品
質問
の開発をしている場合の必要なメソッドを呼び出すたび汎用クラスびんのインスタンス実タイプです。以下のようなものJavaコード:
public class Item<T>{
private T item;
public doSomething(){...}
}
...
public void processItems(Item<?>[] items){
for(Item<?> item : items)
item.doSomething();
}
時にさせていただきましたお急ぎのいる私の問題を定義することによってインターフェースの方法のための呼び出し、汎用のクラスを実施します。
public interface IItem
{
void doSomething();
}
public class Item<T> : IItem {
private T item;
public void doSomething(){...}
}
...
public void processItems(IItem[] items)
{
foreach(IItem item in items)
item.doSomething();
}
この回避策動作してしまいましたが、まず私がどうのこうのは正しい方向での達成と同じ行動です。
編集:
忘れてしまったの参照の呼び出し側の processItems
知らないのです。実際に、この配列として渡された引数 processItems
が含まれる場合があるために混ざり合った。以降することができませんこのような配列です。Net用の汎用基底クラスまたはインターフェースにしてようやく膨大なものとなる。
解決
通常の方法この方法は汎用:
public void ProcessItems<T>(Item<T>[] items) {
foreach(Item<T> item in items)
item.DoSomething();
}
を想定して 呼び出し側 しか知型の型推論すべきということになって明示的に指定します。例えば:
Item<int> items = new Item<int>(); // And then populate...
processor.ProcessItems(items);
とはいえ、非汎用インタフェースを指定するタイプagnostic操作を行うことができます有しています。でもお使いの環境によっては正確な使用例です。
他のヒント
については、下記をご覧くださいたものを呼び出する方法がないパラメータ...が既に契約する: Action
.
public void processItems(IEnumerable<Action> actions)
{
foreach(Action t in actions)
t();
}
クライアント:
List<Animal> zoo = GetZoo();
List<Action> thingsToDo = new List<Action>();
//
thingsToDo.AddRange(zoo
.OfType<Elephant>()
.Select<Elephant, Action>(e => e.Trumpet));
thingsToDo.AddRange(zoo
.OfType<Lion>()
.Select<Lion, Action>(l => l.Roar));
thingsToDo.AddRange(zoo
.OfType<Monkey>()
.Select<Monkey, Action>(m => m.ThrowPoo));
//
processItems(thingsToDo);
が省略でき型のパラメータです。当期純一般実施これによりデザイン。実際、これまで達成されるJavaでタイプ-消去に基づく実装されます。
のみ使用することができベースの非汎用インタフェース( IEnumerable<T>
や IEnumerable
).
さらにJonの。の方法は、一般的にテンプレート)を否定の要件はこのような機能を利用 <?>).でき送り型への汎用クラス/機能の場合についてのお知らないうタイプが必要となりましないように注意してください侵方法/汎用クラスが---最終的には、ユーザが提供される場合に呼び出しなどの機能を利用した一般クラスのコードでコンパイル...なんかコンパイラエラー。
っているとともに、同誌掲載号の注目する際には移植物からのJavaが私を構築しまう
if (o instanceof Collection<?>) doSoemthing((Collection<?>)o);
幸いにも汎用ICollectionも非汎用ICollectionとばから扱う必要がある際に必要な要素としての純粋な物でも可能です。
if (o is ICollection) DoSomething((ICollection)o);
そのように、というのは気にしていない実際の型の要素がコレクションを取得します。で、注意が必要です:場合は、収集したプリミティブ型(intまたはバイトなど)を自動ボックス化点が性能を紹介します。