タグ付けされた質問 「generics」

ジェネリックスは、.NET言語、Java、Swift、Rustなどのさまざまな言語に見られるパラメトリックポリモーフィズムの形式です。

18
IEnumerable <T>として単一の項目を渡す
パラメータTを必要とするメソッドにタイプの単一の項目を渡す一般的な方法はあり IEnumerable&lt;T&gt;ますか?言語はC#、フレームワークバージョン2.0です。 現在、ヘルパーメソッドを使用しています(それは.Net 2.0なので、LINQに似たキャスト/投影ヘルパーメソッドがたくさんあります)が、これはばかげているように見えます。 public static class IEnumerableExt { // usage: IEnumerableExt.FromSingleItem(someObject); public static IEnumerable&lt;T&gt; FromSingleItem&lt;T&gt;(T item) { yield return item; } } もちろん、List&lt;T&gt;またはを作成してデータを入力し、のArray代わりに渡す方法もありIEnumerable&lt;T&gt;ます。 [編集]拡張メソッドとして、次のような名前が付けられます: public static class IEnumerableExt { // usage: someObject.SingleItemAsEnumerable(); public static IEnumerable&lt;T&gt; SingleItemAsEnumerable&lt;T&gt;(this T item) { yield return item; } } ここで何か不足していますか? [編集2]someObject.Yield()(以下のコメントで@Peterが示唆しているように)この拡張メソッドの主な名前は簡潔にするために最適な名前であることがわかりました。 public static class …
377 c#  .net  generics  ienumerable 

22
ジェネリックメソッドを数値型に制限する制約はありますか?
ジェネリック型の引数Tをジェネリック型の引数のみに制限する方法があるかどうか誰かに教えてもらえますか? Int16 Int32 Int64 UInt16 UInt32 UInt64 whereキーワードは承知していますが、専用のインターフェースが見つかりませんこれらのタイプ。 何かのようなもの: static bool IntegerFunction&lt;T&gt;(T value) where T : INumeric
364 c#  generics  constraints 

12
演算子==はC#のジェネリック型に適用できませんか?
MSDNの==オペレーターのドキュメントによると、 定義済みの値タイプの場合、等価演算子(==)は、そのオペランドの値が等しい場合はtrueを返し、それ以外の場合はfalseを返します。文字列以外の参照型の場合、2つのオペランドが同じオブジェクトを参照している場合、==はtrueを返します。文字列型の場合、==は文字列の値を比較します。ユーザー定義の値タイプは、==演算子をオーバーロードできます(演算子を参照)。したがって、ユーザー定義の参照型も使用できますが 、既定では==は、定義済みの参照型とユーザー定義の参照型の両方について上記のように動作します。 では、なぜこのコードスニペットはコンパイルに失敗するのでしょうか。 bool Compare&lt;T&gt;(T x, T y) { return x == y; } 演算子 '=='をタイプ 'T'および 'T'のオペランドに適用できないというエラーが表示されます。私が理解している限り、==演算子はすべてのタイプに対して事前定義されているので、なぜだろうか。 編集:ありがとう、みんな。最初はステートメントが参照型のみに関するものであることに気付きませんでした。また、ビットごとの比較はすべての値の型に対して提供されると思っていましたが、これは正しくないことがわかりました。 しかし、参照型を使用している場合、==演算子は定義済みの参照比較を使用するのでしょうか、それとも型が定義されている場合は、演算子のオーバーロードバージョンを使用するのでしょうか。 編集2:試行錯誤の==結果、無制限のジェネリック型を使用する場合、オペレーターは事前定義された参照比較を使用することがわかりました。実際、コンパイラーは、制限された型の引数に対して見つけることができる最良の方法を使用しますが、それ以上は調べません。たとえば、以下のコードはtrue、Test.test&lt;B&gt;(new B(), new B())が呼び出された場合でも、常にを印刷します。 class A { public static bool operator==(A x, A y) { return true; } } class B : A { public static bool operator==(B x, …

16
クラスがジェネリッククラスから派生しているかどうかを確認する
私のプロジェクトには、派生クラスを持つジェネリッククラスがあります。 public class GenericClass&lt;T&gt; : GenericInterface&lt;T&gt; { } public class Test : GenericClass&lt;SomeType&gt; { } Typeオブジェクトの派生元を確認する方法はありますGenericClassか? t.IsSubclassOf(typeof(GenericClass&lt;&gt;)) 動作しません。
309 c#  generics  reflection 

8
イールドリターンを使用したIEnumerableおよびRecursion
を持っています IEnumerable&lt;T&gt;WebFormsページでコントロールを見つけるために使用しメソッドがあります。 メソッドは再帰的でありyield return、再帰呼び出しの値がreturnigであるときに、必要なタイプを返すときに問題が発生します。 私のコードは次のようになります: public static IEnumerable&lt;Control&gt; GetDeepControlsByType&lt;T&gt;(this Control control) { foreach(Control c in control.Controls) { if (c is T) { yield return c; } if(c.Controls.Count &gt; 0) { yield return c.GetDeepControlsByType&lt;T&gt;(); } } } これは現在、「式の型を変換できません」エラーをスローします。ただし、このメソッドがtypeを返す場合IEnumerable&lt;Object&gt;、コードはビルドされますが、誤ったタイプが出力に返されます。 yield return再帰を使用しながら使用する方法はありますか?

8
Javaジェネリックス-「Tを拡張する」が許可されているが、「Tを実装する」ことができないのはなぜですか?
型パラメーターの境界を定義するために常に " extends"ではなく" " を使用するJavaには特別な理由があるimplementsのでしょうか。 例: public interface C {} public class A&lt;B implements C&gt;{} 禁止されていますが public class A&lt;B extends C&gt;{} 正しい。その理由は何ですか?



13
C#のジェネリック引数のnullまたはデフォルトの比較
次のように定義されたジェネリックメソッドがあります。 public void MyMethod&lt;T&gt;(T myArgument) 最初に行いたいのは、myArgumentの値がその型のデフォルト値かどうかを確認することです。たとえば、次のようになります。 if (myArgument == default(T)) しかし、Tが==演算子を実装することを保証していないため、これはコンパイルされません。だから私はこれにコードを切り替えました: if (myArgument.Equals(default(T))) これはコンパイルされますが、myArgumentがnullの場合は失敗します。これは、テスト対象の一部です。次のように明示的なnullチェックを追加できます。 if (myArgument == null || myArgument.Equals(default(T))) これは私には冗長に感じます。ReSharperは、myArgument == nullの部分をmyArgument == default(T)に変更することを提案しています。この問題を解決するより良い方法はありますか? 参照型と値型の両方をサポートする必要があります。
288 c#  generics 

11
ジェネリックパラメーターとしてnull可能な型は可能ですか?
私はこのようなことをしたいです: myYear = record.GetValueOrNull&lt;int?&gt;("myYear"), ジェネリックパラメーターとしてnull許容型を確認します。 GetValueOrNull関数がnullを返す可能性があるため、最初の試みは次のとおりです。 public static T GetValueOrNull&lt;T&gt;(this DbDataRecord reader, string columnName) where T : class { object columnValue = reader[columnName]; if (!(columnValue is DBNull)) { return (T)columnValue; } return null; } しかし、私が今得ているエラーは: タイプ「int?」ジェネリック型またはメソッドでパラメーター 'T'として使用するには、参照型である必要があります 正しい!Nullable&lt;int&gt;ですstruct!だから私はクラスの制約を制約に変更しようとしましたstruct(そして副作用としてnullこれ以上返すことはできません): public static T GetValueOrNull&lt;T&gt;(this DbDataRecord reader, string columnName) where T : struct …
287 c#  generics 

6
Mockitoを使用してジェネリックパラメーターを持つクラスをモックする
ジェネリックパラメーターでクラスをモックするクリーンな方法はありますか?Foo&lt;T&gt;を期待するメソッドに渡す必要があるクラスをモックする必要があるとしましょうFoo&lt;Bar&gt;。次のことを簡単に行うことができます。 Foo mockFoo = mock(Foo.class); when(mockFoo.getValue).thenReturn(new Bar()); 仮定getValue()はジェネリック型を返しますT。しかし、後でそれを期待するメソッドに渡すと、子猫ができFoo&lt;Bar&gt;ます。これを行う唯一の方法はキャストですか?
280 java  generics  mockito 

5
Scalaの上位の型とは何ですか?
あなたはウェブ上で以下を見つけることができます: より高い種類の型==型コンストラクタ? class AClass[T]{...} // For example, class List[T] 定義に準拠する型を抽象化するため、これはより高い種類の型であると言う人もいます。 上位の種類は、他の型を取り、新しい型を構築する型です これらはタイプコンストラクターとも呼ばれます。(たとえば、Scalaでのプログラミング)。 より高い種類の型==型コンストラクターを型パラメーターとして受け取る型コンストラクター? 論文Generics of a Higher Kindで、あなたは読むことができます ...タイプを抽象化するタイプを抽象化するタイプ(「より種類の高いタイプ」)... " それはそれを示唆しています class XClass[M[T]]{...} // or trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]] より親切なタイプです。 したがって、これを念頭に置いて、型コンストラクタ、より高い種類の型、および型コンストラクタを型パラメータとして取る型コンストラクタを区別することは困難です。したがって、上記の質問です。

17
Javaでジェネリック配列型を作成できない理由は何ですか?
Javaが私たちに許可しない理由は何ですか private T[] elements = new T[initialCapacity]; .NETではそれを行うことができなかったことを理解できました..NETではランタイムに異なるサイズを持つことができる値型がありますが、Javaではすべての種類のTがオブジェクト参照になるため、同じサイズになります(私が間違っている場合は修正してください)。 理由は何ですか?

3
Collections.emptyList()はList <Object>を返しますか?
ジェネリック型パラメーターを推論するためのJavaのルールをナビゲートするのに問題があります。オプションのリストパラメータがある次のクラスを考えてみます。 import java.util.Collections; import java.util.List; public class Person { private String name; private List&lt;String&gt; nicknames; public Person(String name) { this(name,Collections.emptyList()); } public Person(String name,List&lt;String&gt; nicknames) { this.name = name; this.nicknames = nicknames; } } 私のJavaコンパイラーは次のエラーを出します: Person.java:9: The constructor Person(String, List&lt;Object&gt;) is undefined しかし、ではなくCollections.emptyList()タイプを返します。キャストを追加しても役に立たない&lt;T&gt; List&lt;T&gt;List&lt;Object&gt; public Person(String name) { this(name,(List&lt;String&gt;)Collections.emptyList()); } …


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.