問題タブ [generics]
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.
.net - 関係のないいくつかのタイプを保存する必要があるが、特定のタイプをオンデマンドで提供する必要がある状況をどのように処理すればよいですか?
私は、私たちが使用する重要な内部テスト ツールで使用されるファイルのエディターに取り組んでいます。ツール自体は大きくて複雑で、リファクタリングや書き直しには、当面の間、それに専念できる以上のリソースが必要になるため、大きな変更になると私の手は縛られます。.NET 言語を使用する必要があります。
ファイルは、ツールで使用される 4 つのクラスの XML シリアル化バージョンです (これらを A、B、C、および D と呼びましょう)。すべてが順調な場合、クラスはツリー構造を形成します。私たちのエディターは、一連のファイルをロードし、それらをデシリアライズし、それらの間の関係を解決し、見つけた悪い状態を追跡することによって機能します。これらのファイルを手動で編集すると、大量のエラーが発生します。
特定の種類のエラーについて、問題のあるすべてのファイルのコレクションを維持したいと考えています。4 つのクラスすべてで問題が発生する可能性があるため、コードの重複をできるだけ減らしたいと考えています。重要な要件は、ユーザーがアイテムをセットで取得できる必要があることです。たとえば、エラーのあるすべての A オブジェクトを取得する必要があり、コレクション全体を反復処理して必要なものを選択するように指示することは、GetAs()
メソッドと比較して受け入れられません。したがって、最初に考えたのは、シリアル化解除されたオブジェクトといくつかのメタデータを関連付けてエラーを示す汎用アイテムを作成することでした。
次に、ユーザーが必要とするときに特定のクラスのアイテムを抽出するヘルパー メソッドを使用して、すべてのエラー アイテムを保持できるコレクション クラスを作成します。ここからトラブルが始まります。
共通の祖先から継承するクラスはありません ( を除くObject
)。これはおそらく初期設計の間違いでしたが、数日かけて考えてみたところ、各項目を一意に識別する GUID プロパティ以外にクラスに共通点があまりないため、元の設計者が継承によってそれらを関連付けませんでした。これは、統合されたエラー コレクションがErrorItem<Object>
オブジェクトを格納する必要があることを意味します。これは、入ってくるものを制限する基本クラスやインターフェイスがないためです。
ただし、これはパブリック インターフェイスに影響を与えます。私が本当に欲しいのは、次のErrorItem
ような適切なジェネリック型を返すことです:
収納しかできないから無理ErrorItem<Object>
!頭の中でいくつかの回避策を検討しました。ほとんどの場合ErrorItem
、適切なタイプの新しいものをオンザフライで作成することが含まれますが、それはちょっと醜いように感じます. 別の考えでは、Dictionary
アイテムをタイプ別に整理するために を使用していましたが、まだ正しくないようです。
ここで私を助けるかもしれないある種のパターンはありますか? これを解決する最も簡単な方法は、A、B、C、および D が派生する基本クラスを追加することだとわかっていますが、元のツールへの影響をできるだけ小さくしようとしています。回避策のコストは、最初のツールを変更するためにプッシュする必要があるほど大きいですか?
java - Javaで汎用リストを複製するにはどうすればよいですか?
ArrayList<String>
コピーを返したい があります 。ArrayList
次のシグネチャを持つ clone メソッドがあります。
このメソッドを呼び出した後、返されたオブジェクトを にキャストするにはどうすればよいArrayList<String>
ですか?
.net - .NET の非ジェネリック コレクションは時代遅れですか?
別の言い方をすると:
タイプセーフなコレクションよりも緩く型付けされたコレクションを選択する正当な理由はありますか (HashTable と Dictionary)? それらは互換性のためだけにまだ存在しますか?
私が理解している限りでは、ジェネリック コレクションはタイプ セーフであるだけでなく、パフォーマンスも優れています。
このトピックに関する包括的な記事は次のとおりです: C# 2.0 を使用したデータ構造の広範な調査。
java - EasyMock: 警告なしでジェネリック化されたクラスのモックを作成するにはどうすればよいですか?
コード
「型の安全性: SomeClass 型の式は、SomeClass<Integer> に準拠するために未チェックの変換が必要です」という警告が表示されます。
.net - Generic.IList 間の呼び出しのあいまいさを解決する方法.this[] と IList.this[]?
IList<T> と List の両方を拡張するインターフェイスを実装するコレクションがあります。
つまり、2 つのバージョンのインデクサーがあるということです。
一般的な実装を使用したいので、通常どおり実装します。
シリアライゼーションには IList バージョンのみが必要なので、明示的に実装して隠しておきます。
ただし、私の単体テストでは、次の
コンパイラ エラーが発生する
次のメソッドまたはプロパティ間の呼び出しがあいまいです
これには少し驚いています。私は以前にそれをやったと信じており、うまく機能しています。ここで何が欠けていますか?IList<T> と IList を同じインターフェイス内に共存させるにはどうすればよいですか?
Edit IList<T> はIList を実装していないため、シリアル化のために IList を実装する必要があります。回避策には興味がありません。不足しているものを知りたいです。
もう一度編集: インターフェイスから IList を削除して、クラスに移動する必要がありました。インターフェイスを実装するクラスは最終的に Xaml にシリアル化されるため、IDictionary または IList を実装するコレクションが必要になるため、これを行いたくありません...
c# - Activator.CreateInstance(string) および Activator.CreateInstance() 違い
いいえ、これはジェネリックに関する質問ではありません。
内部コンストラクターを持ついくつかのクラスを持つファクトリーパターンがあります(ファクトリーを介していない場合、それらをインスタンス化したくありません)。
私の問題は、CreateInstance
非公開パラメーターに「true」を渡さない限り、「このオブジェクトにパラメーターなしのコンストラクターが定義されていません」というエラーで失敗することです。
例
次のように、ファクトリをジェネリックにしてもう少しシンプルにしたかったのです。
ただし、その「true」パラメーターを渡して非公開コンストラクターを受け入れる方法を見つけることができませんでした (内部)。
私は何かを見逃しましたか、それとも不可能ですか?
.net - 開いているジェネリック型を配列に保存しますか?
.NET ジェネリックの問題に直面しています。私がやりたいことは、ジェネリック型 (GraphicsItem) の配列を保存することです。
このようなオープンジェネリック型を配列に保存するにはどうすればよいですか?
java - 次のコードをジェネリックを使用するように変換できますか?
Java 1.5を使用するようにアプリケーションを変換していますが、次の方法が見つかりました。
理想的には、メソッドに同じタイプの2つのComparableを使用させたいのですが、これをどのように変換することは可能ですか?
私は次のことがうまくいくと思いました:
しかし、IntelliJの「未加工のタイプ「java.lang.Comparable」のメンバーとしての「compareTo(T)」へのチェックされていない呼び出し」の警告を取り除くことができませんでした。
c# - C#でジェネリックスを使用して数学ライブラリを作成する
ジェネリックスを使用して、データを格納するために選択された基本タイプに依存しない数学ライブラリを作成するための実行可能な方法はありますか?
つまり、Fractionクラスを作成したいとします。分数は、2つのintまたは2つのdoubleなどで表すことができます。重要なことは、基本的な4つの算術演算が明確に定義されていることです。だから、私は書くことができるようになりたいFraction<int> frac = new Fraction<int>(1,2)
ですFraction<double> frac = new Fraction<double>(0.1, 1.0)
。
残念ながら、4つの基本操作(+、-、*、/)を表すインターフェイスはありません。誰かがこれを実装するための実行可能で実行可能な方法を見つけましたか?
c# - C# でのジェネリック引数の null または既定の比較
次のように定義されたジェネリックメソッドがあります。
最初にやりたいことは、myArgument の値がその型の既定値であるかどうかを確認することです。たとえば、次のようになります。
しかし、T が == 演算子を実装することを保証していないため、これはコンパイルされません。だから私はこれにコードを切り替えました:
これでコンパイルできますが、myArgument が null の場合は失敗します。これは、テスト対象の一部です。次のように明示的な null チェックを追加できます。
今、これは私には冗長に感じます。ReSharper は、myArgument == null 部分を myArgument == default(T) に変更することを提案しています。これが私が始めた場所です。この問題を解決するより良い方法はありますか?
参照型と値型の両方をサポートする必要があります。