問題タブ [generic-method]
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.
c# - ジェネリックメソッドの型パラメーターを特定のインターフェイスの閉じられていない型に制約するのと同等の型安全性
C#では、ジェネリックメソッドの型パラメーターを制約して、型に安全な方法で閉じられていない型のインターフェイスに制限することはできますか?詳しく説明させてください...
たとえば、次の疑似コードがあります。
ICreateValidatorやIDeleteValidatorなどのIValidatorを実装するインターフェイスがいくつかあります。すべてのタイプT、Tのすべての基本クラス、およびTによって実装されたインターフェイスに近い方法で、必要なバリデーターを簡単に収集できます。
欲望は、の線に沿って何かを呼び出すことができるでしょう
これにより、閉じられていないタイプのIDeleteValidator <>が提供され、IDeleteValidaorの各実装を内部で見つけることができます。ここで、TはconcreteDomainObjectタイプ、concreteDomainObjectタイプが実装するインターフェイス、または再帰ベースタイプconcreteDomainObjectタイプがオブジェクトまで拡張されます。 。
確かに、ドメインオブジェクトのインターフェイスを閉じることはできますが、呼び出す必要があることは私には意味がありません。
コンパイル時にTValidatorがジェネリック型であるとは確信できず、明示的に閉じられたTValidatorは、閉じている型を取り除く以外は使用されないことを考えると、これは私にとって間違った方法のようです。
私が提供した疑似コードは明らかに機能しますが、ジェネリックメソッドのタイプを特定のインターフェイスの閉じられていないタイプにconstrianするのと同等のタイプセーフはありますか?
いくつかの用語を修正するために編集
c# - ジェネリック メソッド ロジックを最適化する
T をインターフェイス タイプとして渡すことができるジェネリック メソッドが 1 つあります。メソッドは、T 型に対応するデータのリストを返します。このメソッドには 20 ~ 25 の同じ条件があり、ロジックを最適化するにはどうすればよいですか。
クラスはインターフェースを実装します。example Student クラスは IStudent インターフェイスを実装しています。
ここで、呼び出し元はインターフェイスの型 T を渡し、T の型をチェックします。他の関数 T と T のリストを返すクラスに渡します。基本クラスの他の関数は変更できません。誰かが私に同じことを提案できますか?
c# - 反射からの型を型パラメーターとして使用できますか?
反射からの型を型パラメーターとして使用できますか?たとえば、渡されたオブジェクトに基づいてパーシスタを選択したい:
c# - ジェネリックな制約を持つジェネリック メソッド
私がやりたいのは、ジェネリック型を制約付きのパラメーターとして受け取るメソッドを持つことです。ただし、制約の型には2番目のジェネリック型もありますが、2番目の型に関係なくメソッドが機能するようにしたい:
EventManager
具体的には、クラスにあらゆる種類のイベントを受け取り、それを使って何かをさせようとしています。私は物事を過度に複雑にしていますか、それとも実行可能ですか?
c# - 異なる型を返す場合、複数のメソッドが推奨されますか?
オブジェクトから値を返していEntity
ます。String
タイプされているものとそうでないものがあります。今、私は次のように簡単な解決策を実行しました。
次に、ジェネリック型付けの構文 ( のようなもの) があることを思い出しました<TypeX>
。ただし、私の質問は、既存のコードの変更を開始するポイントがあるかどうかです。メソッドのシグネチャを 2 か所 (戻り値の型と置換型) で変更する必要がありますが、メソッド内でも複雑なコーディングを行う必要があるのではないかと心配しています。
一方で、考えられるすべての型を処理する良い方法があると思います (そして、文字列と整数以外のものを扱うことになる予感があります。
java - Java ジェネリック メソッドの呼び出し
私は Java の一般的な機能を勉強していますが、次のmain
メソッドの 3 行目をどのように説明すればよいかわかりません。
最初の行は、(予想どおり) コンパイル、実行、および戻りますfalse
。
String
と を明示的に混合しているため、2 行目は期待どおりにコンパイルされませんLong
。
3 行目はコンパイル、実行、および false を返しますが、それがどのように機能するのかよくわかりません: コンパイラ/JVM はパラメーターの型T
を としてインスタンス化しますObject
か? (また、この宣言された型のT
ランタイムを取得する方法はありますか?)
ありがとうございました。
c# - C# ジェネリック メソッドとキャスト
シンプルなプラグイン アーキテクチャを使用して入出力を制御するプログラムを C# (現時点では 3.5 ですが、必要に応じて他のバージョンにも適用できる可能性があります) で作成しています。各プラグインは、ユーザーが使用するプラグインを選択したときにロードされる DLL です。
実際のプラグイン クラスは実行時までわからないため、ラッパー クラスでリフレクションを使用してメソッドを呼び出し、プラグインのプロパティにアクセスしています。
これまで、プラグインのメソッドを呼び出すために以下を使用してきました。
次のように使用されます。
これは、呼び出し元が戻り値を期待される型に正しくキャストしている限り、うまく機能します。プラグインは特定のインターフェースを実装する必要があるため、呼び出し元はこのタイプを知っている必要があります。
ただし、リフレクションでさらに作業を行った後、次の代替形式が思い浮かびました。
これは次のように使用されます。
このバージョンでは、基本的にキャストがメソッド メソッドに移動されます。呼び出し元は、期待される戻り値の型を知る必要があることは明らかですが、それは常に当てはまります。void メソッドでは機能しませんが、メソッドのバージョンを含めることができます。
私の質問は、これらの 1 つが他のものよりも本質的に優れているかどうかです (「より良い」値が与えられた場合)。たとえば、著しく高速ですか?分かりやすい?さらにサポートされますか?
個人的には後者の見た目が好きですが、戻り値の型テスト ( Methods[methodName].ReturnType != typeof(T)
) が単純すぎるのではないかと少し心配です。興味深いことに、元々は でしたが、それは!(Methods[methodName].ReturnType is T)
常に失敗しているように見えました。
私が見つけたこれに最も近い既存の質問はGeneric method to type castsであり、回答のいくつかは、後者の方法が前者よりも高価であることを示唆していましたが、そこには詳細な方法はあまりありません(質問はよりどちらが優れているかではなく、メソッドの実装)。
明確化:これは、IPlugin を使用しない、非常に限られた手動のプラグイン システムです。この状況で呼び出し元がキャストすることを期待するよりも、ジェネリックメソッドが本質的に優れているか悪いかという問題にもっと興味があります。
java - ジェネリック クラスの Java ジェネリック メソッド
Java でジェネリック クラスを作成する場合 (クラスにはジェネリック型パラメーターがあります)、ジェネリック メソッドを使用できますか (メソッドはジェネリック型パラメーターを取ります)。
次の例を検討してください。
ジェネリック メソッドで期待されるように、任意のオブジェクトdoSomething(K)
で のインスタンスを呼び出すことができます。MyClass
MyGenericClass
ただし、ジェネリック型を指定せずにのインスタンスを使用しようとすると、渡されたものに関係なく、 を呼び出すとdoSomething(K)
が返されます。Object
K
奇妙なことに、戻り値の型がジェネリック クラスの場合はコンパイルされますList<K>
(実際には、これは説明できます - 以下の回答を参照してください)。
また、ワイルドカードのみであっても、ジェネリック クラスが型指定されている場合はコンパイルされます。
型指定されていないジェネリック クラスでジェネリック メソッドを呼び出すことが機能しない正当な理由はありますか?
私が見逃しているジェネリッククラスとジェネリックメソッドに関連する巧妙なトリックはありますか?
編集:
明確にするために、型指定されていない、または生の型指定されたジェネリック クラスは、ジェネリック クラスの型パラメーターを尊重しないと予想します (それらが提供されていないため)。ただし、型指定されていない、または型指定されていないジェネリック クラスが、ジェネリック メソッドが尊重されないことを意味する理由は明らかではありません。
この問題は SO ですでに提起されていることが明らかになりました。この質問を参照してください。これに対する答えは、クラスが型付けされていない/生の形式の場合、ジェネリックメソッドの型付けを含め、すべてのジェネリックがクラスから削除されることを説明しています。
しかし、なぜそうなのかについては、まったく説明がありません。それでは、私の質問を明確にさせてください:
- Java が型指定されていない、または raw 型のジェネリック クラスでのジェネリック メソッドの型付けを削除するのはなぜですか? これには正当な理由がありますか、それとも単なる見落としでしたか?
編集 - JLS の議論:
これはJLS 4.8で扱われることが (前の SO の質問とこの質問への回答で) 提案されており、次のように述べられています。
コンストラクター (§8.8)、インスタンス メソッド (§8.4、§9.4)、または非静的フィールド (§8.3) の型 M スーパークラスまたはスーパーインターフェイスから継承されていない生の型 C は、対応する生の型です。 C に対応するジェネリック宣言での型の消去に。
これが型指定されていないクラスにどのように関連するかは明らかです。クラスのジェネリック型は消去型に置き換えられます。クラスジェネリックがバインドされている場合、消去タイプはそれらの境界に対応します。それらがバインドされていない場合、消去タイプはオブジェクトです-例
ジェネリック メソッドはインスタンス メソッドですが、JLS 4.8 がジェネリック メソッドに適用されるかどうかはわかりません。ジェネリック メソッドの型 (<K>
前の例) は型指定されていません。その型はメソッド パラメーターによって決定されるためです。
c# - ジェネリック メソッドの戻り値の XML コメントを修正
メソッド Login の戻り値の XML コメントを作成する必要があります。このメソッドは、Result のオブジェクト タイプを返します。このオブジェクトには、ログインが成功した場合はセッション ID が含まれ、ログインが失敗した場合はエラー メッセージが含まれます。
これを XML コメントでどのように記述すればよいかわかりません。
アドバイスありがとうございます。