問題タブ [nested-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.
java - パラメータ化された型パラメータ?
渡された記述子に従って、含まれているオブジェクトのインスタンスを解放するコンテナを使用してライブラリを作成しようとしています。記述子が返されるオブジェクトの型を決定するようにしたいのですが、記述子は境界付きの型を指定できます。これを実装するにはどうすればよいですか?たとえば、私が得ることができる最も近いものは次のとおりです。
上記のコードはコンパイルされますが、問題は もChannelArchive
sgetItem
を返す可能性があることSeekableByteChannel
です。このライブラリのユーザーはコンパイル時にこれを知っているため (記述子の型パラメーターを知っているため)、必要に応じClass
て戻り値を明示的にキャストすることをユーザーに強制するために、型のメソッドパラメーターを追加しないようにしていますSeekableByteChannel
。ユーザーにキャストを強制せずgetItem
に特定のサブタイプを返す方法がわかりません。ByteChannel
私はこれをしたい:
各メソッドにパラメーターを追加できますが、メソッドのコードはメソッド パラメーターClass<? extends I>
を完全に無視します。Class
唯一の目的は、コンパイラが型を推測できるようにすることです。instanceof
コードが非常に難読化されているため、ユーザーにチェックとキャストを使用させる方が簡単だと思います。
私はこれを試しました:
しかし、それはうまくいきません: ChannelArchive is not abstract and does not override abstract method getItem(ChannelItemDescriptor<? extends ByteChannel>) in ArchiveContainer
. これは、2 番目の型パラメーターの<II extends ByteChannel>
型消去が<? extends ByteChannel>
?と異なるためだと思います。
私もこれを試しました。これはコンパイルされます:
コンパイルされても、そのメソッド内に必要なため、実際には機能しません。結果のキャストは、追加されたジェネリックの型安全性を使用する目的を無効にします。ChannelItemDescriptor
正しい型はコンパイル時にわかっているので、なぜそれができないのかわかりません。そのインターフェイスで本当に必要なArchiveContainer
のは、次のようなパラメーター化された型パラメーターです<II extends I, DD extends D<II>>
。私は何を間違っていますか?
注: 実際には and は使用しませんがByteChannel
、SeekableByteChannel
使用するものは非常に似ています。
ItemDescriptor
ブロック 4 のコードに落ち着きました。私の場合、ユーザーがa の呼び出しで間違っgetItem
たsublcass を送信する可能性はほとんどありませArchiveContainer
んgetDescriptors
。
c# - IEnumerableをフラット化>; ジェネリックを理解する
私はこの拡張メソッド(コンパイル)を作成しました:
以下のコードはコンパイル時エラーを引き起こします(適切なメソッドが見つかりません)、なぜですか?:
以下のように拡張機能を実装すると、コンパイル時エラーは発生しません。
Edit(2):この質問は答えられたと思いますが、過負荷の解決と型の制約に関する別の質問がありました。私がここに置いたこの質問:タイプ制約がメソッドシグネチャの一部ではないのはなぜですか?
c# - 型制約がメソッド シグネチャの一部ではないのはなぜですか?
更新: C# 7.3 以降、これは問題ではなくなりました。リリースノートから:
メソッド グループに、型引数が制約を満たさないジェネリック メソッドが含まれている場合、これらのメンバーは候補セットから削除されます。
C# 7.3 以前:
だから私はEric Lippert の 'Constraints are not part of the signature'を読み、オーバーロードの解決後に型制約がチェックされることを仕様が指定していることを理解しましたが、なぜこれがそうでなければならないのかについてはまだ明確ではありません。以下はエリックの例です。
オーバーロードの解決 for: が最適なオーバーロード マッチであると推測するため、これはコンパイルされませんFoo(new Giraffe())
がFoo<Giraffe>
、型制約が失敗し、コンパイル時エラーがスローされます。エリックの言葉で:
ここでの原則は、オーバーロードの解決 (およびメソッドの型の推論) であり、引数のリストと各候補メソッドの仮パラメーターのリストとの間で可能な限り一致するものを見つけます。つまり、候補メソッドのシグネチャを調べます。
型制約は署名の一部ではありませんが、なぜできないのでしょうか? 型制約を署名の一部と見なすのが悪い考えであるシナリオには、どのようなものがありますか? 実装が難しい、または不可能ですか?最適なオーバーロードが何らかの理由で呼び出すことができない場合は、2 番目に最適なオーバーロードに静かにフォールバックすることを推奨しているわけではありません。私はそれを嫌います。最適なオーバーロードの選択に影響を与えるために型制約を使用できない理由を理解しようとしています。
私は、C# コンパイラの内部で、オーバーロードの解決のみを目的として (メソッドを完全に書き換えるわけではありません)、次のことを想像しています。
次のように変換されます:
型制約を仮パラメータ リストに「引き込む」ことができないのはなぜですか? これはどのように署名を悪い方法で変更しますか? 署名を強化するだけのような気がします。次にFoo<Reptile>
、過負荷候補と見なされることはありません。
編集 2:私の質問がとても混乱していたのも不思議ではありません。私は Eric のブログを正しく読んでおらず、間違った例を引用しました。より適切だと思う例を編集しました。また、タイトルをより具体的なものに変更しました。この質問は、最初に想像したほど単純ではないように思えます。おそらく、いくつかの重要な概念が欠けています。これがスタックオーバーフローの資料であるかどうかはわかりません。この質問/ディスカッションを他の場所に移動するのが最善かもしれません.
java - Java でネストされたマップのチェックされていないキャストを回避する
この JSON を逆シリアル化した結果の Java データ構造があります。
Java では、これは次のようになります。
もちろん、レベルの数は任意なので、変数宣言でコレクションをネストすることはできません。私が代わりにやっていることはこれです:
これは明らかに a) いくつかのチェックされていないキャストを使用しており、b) 醜いです。これを回避するために、新しい型を定義しようとしました。
ただし、これにより実行時例外が発生します。
クリーンで警告のない方法でこれを行うにはどうすればよいですか?
c# - ジェネリクスとリフレクション ソースで失われた
独自の種類のパラメーターを使用して MultiSelectList を構築するための MVC ヘルパーを構築しようとしています。少し前に作成した SelectFor ヘルパーに基づいています。SelectFor は次のようになります。
MultiSelectFor はわずかに異なるだけで、重要な違いが 1 つあります。は のプロパティ タイプのforExpression
ジェネリックになります。このコレクションは、リスト項目を「事前選択」するために使用され、フォーム上で選択された項目の戻り値になります。私はこれでさらに進んだ(と思う)が、まだかなり迷っている.IEnumerable
idExpression
助けていただければ幸いです。
更新 答えてくれてありがとう!ジェネリックは時々私を混乱させます。完全なソリューションは次のとおりです。
助けてくれてありがとう!
c# - ネストされたジェネリック インターフェイスの実装
私は次のクラス/インターフェースを持っています:
次のコードを使用して新しいインスタンスを作成しようとしています。
次のエラーが表示されます。
誰かがなぜこれが不可能なのか説明してもらえますか?
java - スーパーコンストラクターに渡されるとコンストラクター引数が失われる
私の GWT アプリには、別の抽象的なスーパークラスを拡張するスーパークラスを拡張するデータ型 (同様のオブジェクトの階層を構築および追跡することを目的としたもの) があります。抽象クラスで宣言された汎用パラメーターがあり、各サブクラスによってそれ自体の型として指定されます。構造は次のとおりです。
親引数を SpecialFoo のコンストラクターに渡すと、Foo のコンストラクターがスーパーコンストラクターとして呼び出され、そのコンストラクターが AbstractFoo のコンストラクターをスーパーコンストラクターとして呼び出します。
私が抱えている問題は、Foo から AbstractFoo に渡されると、parent 引数が NULL にリセットされることです。なぜこれが起こるのか分かりません。無傷で抽象基本クラスに渡すために何をする必要があるか教えてもらえますか?
編集: 私はそれを解決したと思います...トリックは、次のように、より具体的な参照があるように、各サブクラスで親引数を宣言する必要があるようです:
c# - ネストされた一般的な構文のあいまいさ>>
どうやら、C#はC++と同じように'>>'レクサーのジレンマの影響を受けやすいようです。
このC#コードはかなり有効で、コンパイルして正常に実行されます。
上記のDummyクラスの'<'および'>>'演算子をオーバーロードする必要があります。
しかし、コンパイラーは、「x」の場合、その意味はList、Nullable、およびGuidローカル変数を使用することであると推測することができます。そして、「y」の場合、突然、それらをよく知られたタイプの名前として扱うことを決定します。
別の例を使用して、もう少し詳細な説明を示します。http: //mihailik.blogspot.co.uk/2012/05/nested-generics-c-can-be-stinky.html
問題は、C#コンパイラが「a <b <c>>」を算術式またはジェネリック型/メソッドにどのように解決するかということです。
確かに、それは成功するまでプログラムのテキストに複数の「行き」を持たせようとはしませんか、それともそうしますか?それには、無制限の先読みが必要であり、非常に複雑でもあります。
java - Generics で定義されたエンティティの .class を取得するには?
では、Javaで次のことを行うにはどうすればよいですか?
この問題は特に List.class で発生し、返されるエラーは次のとおりです。
c# - ネストされた型 arg を使用してオブジェクトを動的にインスタンス化するときに TypeLoadException がスローされる
仕事でOSS プロジェクトに貢献しているときに、TypeLoadException に遭遇しました。私は、新しいコードを分離していくつかのテストを実行できるように、開発者が独自の Repository クラスを挿入して EF への具体的な依存関係を削除できるようにするシームの作成に取り組んでいます。
Activator.CreateInstance()
ネストされた型引数を持つ型に対して実行すると、実行時にそれを作成する際にレンチがスローされるようです。このパターンはこれまで何度も使用してきましたが、今回の違いは、汎用リポジトリ パターンの実装を動的に挿入するために使用していることです。問題は実際にはその型 arg に関連しているようです。私は現在困惑しているので、どんな助けでも大歓迎です。
これが私が得ているエラーです:
以下は、Rock.Data 名前空間からの関連する (注釈付きの) コード スニペットの一部です。
IRepository.cs
EFRepository.cs
Service.cs
RepositoryFactory.cs
そして、これは私が別の Rock.Tests プロジェクトで使用している偽のオブジェクトとテスト コード スニペットの一部です...
FakeRepository.cs
PageTests.cs
App.config
うまくいけば、それはそれをかなり完全にカバーしています。前もって感謝します!