問題タブ [parametric-polymorphism]

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.

0 投票する
2 に答える
1298 参照

c++ - 「真のポリモーフィズム」の例? (できれば Haskell を使用)

「真のポリモーフィズム」の部分的な定義をたくさん見てきました。たとえば、ここここですが、2 つの具体的な例との違いの明確な例を見つけることができませんでした。

+演算子のオーバーロードはポリモーフィズムの一種であり、Haskell と C++ では実装が異なることを理解しています。誰かが両方の言語の例で違いが何であるかを正確に示すことができますか?

0 投票する
1 に答える
362 参照

java - パラメトリック型の Java 配列

これは、物事をどのように行うかという問題ではありませんどうしてそうなるのかという問題です。

Java の配列は、実行時にコンポーネントの型を認識します。また、型消去のために、ジェネリック型変数の配列オブジェクトを持つことはできません。ジェネリックを含む配列型は許可され、健全な読み取り/書き込みがチェックされます。唯一の問題は、アロケーター式のようです。

Java コンパイラでは、次のことも許可されていないことに注意してください。

...どこにあるPongのは、古いパラメトリック クラスです。ここには未知のものは何もありません。はい、実行時にlotsofpongは単に の配列になりますがPong、コンパイラがコンパイル時の目的で型パラメーターを記憶できない理由がわかりません。これらの型はコンパイル時に存在するため、実際にはそれを覚えています。したがって、唯一の問題は、コンパイル時にアロケーターに特定の汎用パラメーター関連のコンポーネント型を与えることを拒否しているようです。

のパラメーターがPongジェネリック型変数であったとしても、違いはありません。動的配列は依然として の配列でありPong、要素ごとに のサイズが必要でありPong、型パラメーターに依存しません。

はい、それを回避する方法があることを知っています-非パラメトリック型からのキャスト (おそらく SuppressWarning を使用) を使用するかPong<Integer>、非パラメトリック クラスでサブクラス化し、代わりにその型を使用します。しかし、この種のアロケーターが許可されない理由はありますか?

0 投票する
1 に答える
108 参照

c# - C# でのパラメトリック ポリモーフィズムでエラーが発生する

この関数では:

これはパラメトリック ポリモーフィズムを使用しており、取得しitemcollectionて参照し、適切なアクセス許可である場合はリストに追加してから、リストを返します。返されるリストは typeであるため、タイプまたは私のコードに基づいてTいる可能性があります。SPFolderSPListItem

for ループ内の項目は既に typeSPListItemであり、型の場合Tは、項目のメソッドSPFolderを呼び出す必要があります。.Folderこれを検出することはできないため、ヘルパー変数を使用して使用する必要があるかどうかを判断する必要がありました。

しかし、問題は、これを行っても type にキャストしようとするとエラーが発生することTです。

TメソッドSPFolderを呼び出すときになり、それ以外の場合は型になります。.FolderTSPListItem

誰かがこれの修正を見ていますか?

ありがとう。

0 投票する
2 に答える
4886 参照

c++ - 戻り値の型が異なる C++ ポリモーフィック関数

一意のキーと任意の値を文字列として格納するプロパティ クラスを作成しています (さらに、構成ファイルへの書き込み時に使用するオプションのコメント文字列)。現在、生の文字列を保持する基本プロパティ クラスを作成し、これをタイプ固有のプロパティにサブクラス化する方法を使用しています。文字列を int に変換する getValue() 関数を実装する IntProperty - プロパティ値を読み取るたびに文字列から手動で変換する必要がないようにします。これらのサブクラスは、getPropertyType() という仮想関数を使用します。これは、ベースで定義され、各派生でオーバーライドされる仮想関数であり、保持するプロパティのタイプを識別する列挙型の値を返します。ベース クラスは「none」識別子を返します。

(ちなみに、私は Qt を使用しており、Qt に必要なインターフェイス マクロがテンプレート化されたオブジェクトをサポートしていないため、テンプレートを避けました。テンプレートを使用する価値がある場合は、インターフェイスを使用するという考えを捨てるかもしれません。)

私の意図は、基本プロパティ クラスからサブクラス化し、基本プロパティ ポインターの配列を許可することで、複数の異なる種類のプロパティ (string、int、float...) のリストを許可することでした。ただし、派生クラスの 1 つからプロパティを特定の型として抽出するのが非常に厄介になるという問題に遭遇します。これは、基本クラスへのポインターが派生クラスで新しく定義された getValue 関数を明らかに認識していないためです。基本クラスから文字列を抽出して手動で変換するか、基本クラスのポインターを正しい派生クラスのポインターにキャストするかのいずれかのオプションが残っています。最初のオプションでは、変換を手動で行う必要があるため、サブクラス化が役に立たなくなります。

この問題を解決する最も賢明な方法は何でしょうか? プロパティ値の取得をできるだけシンプルに保ちたいと考えています。配列から基本クラスのポインターを取得してから、プロパティの値の適切に型指定されたコピーを保持するまでのボイラープレート コードをできるだけ少なくします。問題を逆に検討する価値はありますか?文字列を使用してそれぞれの値の取得と設定をすべてサポートする、複数の厳密に型指定されたプロパティ クラスがありますか?

0 投票する
3 に答える
7214 参照

c# - c#でクラス型を変数として保存する方法は?

C# で、このようなことができますか?

基本的に型を変数として格納したいので、変数をキャストとして使用できます。私のパラメトリック多態性関数では、変数が2つのタイプのうちの1つである可能性があるため、これを実行しようとしています。どちらのタイプにも使用したい同じメソッドがありますが、変数タイプであるため使用できません。

少なくともキャストを値として格納できれば、関数に別のブール値を渡して、2 つの型のどちらであるかを示すことができます。

0 投票する
1 に答える
611 参照

scala - Scala での Map キーと値型パラメーター間の依存関係

マップ内のキーと値のタイプ間の依存関係をエンコードすると便利な場合があります。次のタイプを検討してください。

ここで、シーケンス内の各ペアは同じ type を持つ必要がありTます。しかし、そのようなタイプは、マップのような使用法に関してはあまり便利ではありません。ただし、 2つの独立した型パラメーターがあり、それらを「グループ化」して単一の存在型を使用することはできないためMap[K, V]、のような依存関係を表現できません。Mapナイーブ バリアント

単一のタイプを強制するだけTです。すべてのMyMapエントリに適用されますが、それぞれ個別に適用されるわけではありません。

私が思うもう一つの極端な例は、

しかし、もちろん、これは広すぎる定義であり、キーと値の型の任意の組み合わせが可能です。

だから私の質問は、Scala でそのような型をエンコードすることは可能ですか? はいの場合、どのように?