問題タブ [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 - Javaメソッドにネストされたジェネリック?
独自のMVPフレームワークを作成していますが、ジェネリックに問題が発生しています。
私のプレゼンターはこのように定義されており、一般的なプレゼンターでもある子要素への参照を保持する内部クラスがあります。
そして私はこれの具体的な実装を持っています
と
ここで、ResultsView、SearchViewはViewとResultsを拡張し、StringKeyはKeyを実装します
メソッドaddStage(...)は、次のコンパイル時エラーをスローします。
任意の助け、またはより良い実践は、大いに感謝されます
c# - 入れ子になったジェネリック型を推論できないのはなぜですか?
次のクラスを考えると...
...そして次の方法...
次のコード行が戻り値の型を暗示できないのはなぜですか?
代わりに、このようなジェネリック型を指定する必要があります...
java - Javaジェネリック地獄
これは以前にここで質問された(そして回答された)と思われますが、問題の名前を付ける方法がわかりません。クラス自体を渡していない場合にのみ、問題なくワイルドカードを表現できるのはなぜですか?
すべてはこのコードに集約されます。への呼び出しを除いて、すべてが期待どおりに機能しますgenericsHell(ShapeSaver.class)
。
java - マップに挿入されたリストで境界のあるワイルドカードが機能しない
次のコードは私の問題を説明しています:
No. 1 と 2 は機能しますが、いいえ。3 日食でエラーが発生します。それは言います:Type mismatch: cannot convert from HashMap<String,List<f2>> to Map<String,List<? extends f1>>
理由を理解するのを手伝ってくれませんか。
c# - C# がジェネリックのジェネリック (パラメーター化された型を持つジェネリック) をサポートしないのはなぜですか?
MyType<T>
最近 (おそらく設計上の欠点により)、修正されていない場所のコレクションT
(つまり、1 つのコレクション全体で複数のさまざまなジェネリックのインスタンス化)が必要な場合に、定期的なタスクに直面しました。
(そのような場合に)広く提案されているように、抽象クラスが宣言されました。
そして、私はのコレクションを持っていMyType
ます。ただし、このコレクションでは、どのタイプの要素も 1 つしか持たないという制約がありましたT
。
したがって、私は のカスタム実装を少し作成しましたICollection<TBase>
。Get<TParam>()
type に対応するアイテムを取得するメソッドをそこに含めたかったのTParam
です。後で次のように使用します。
しかし、私はそれを宣言することさえできないことを予期せず発見しました:
内部ジェネリック (またはいわゆる「ジェネリックのジェネリック」) は、C# でも .NET でもサポートされていないためです (私は推測します)。そのような制限の背後に特定の理由があったとどう思いますか (複雑さを除く)?
UPDATE 1.コンパイラのバージョンとコンパイラのエラーについて尋ねました。
Microsoft C#、.NET 3.5 (Visual Studio 2010)。エラー:
エラー CS0081: 型パラメーターの宣言は、型ではなく識別子である必要があります
エラー CS0246: 型または名前空間名 'TCustom' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
UPDATE 2.修正または説明が必要かどうかを尋ねられました。私は本当に理由を知りたいです。ただし、問題に対する適切な解決策がある場合は、大歓迎です。
更新 3.質問は、このブログ投稿で既に回答されている可能性があります。CLR チームは、言語を過度に複雑にしないようにという大きなプレッシャーにさらされていたようです。
c# - Generics Node 宣言
Microsoft は、ジェネリックを学習するためのバブル ソートの例としてこれを示しています。76 行目と 77 行目に到達するまでは意味があります。これらの宣言はどのようにして可能になるのでしょうか? ノードはクラスです。newでインスタンス化する必要はありませんか?並べ替えをどのように最適化しますか? 汎用部品と非汎用部品はどれですか?
java - Java のネストされた型パラメーター
これは、実際のコードを簡略化するために作成した例であるため、少し不自然である場合は申し訳ありません。私がやりたいことは、ネストされた 1 つの型引数から 2 つの型パラメーターを効果的に取得することです。これは不可能だと確信していますが、試してみようと思いました。
別の型パラメーターを追加することでそれを実行できることはわかっています。
しかし、冗長を追加する必要があります:
そして、私の実世界のケースでは、私のジェネリックは、次のようにimplements句で指定できる場合があります
2 番目の型パラメーターを指定しなければならないことは、実装の詳細が目の前に投げ出されるように感じられるため、さらに苦痛です。言わなければならない
String と Bar の間にすでに関係がある場合は、エレガントではないように見えます。私はそれがJavaであることを知っているので、それは領土に合っていますが、これに対する解決策があったかどうかは興味があります.
c# - ジェネリックスによる隠し型推論?
重複の可能性:
ジェネリック拡張メソッドによる型推論なし
私は汎用インターフェースとそれの2つの具体的な実装を持っています。
次に、そのインターフェイスを実装するオブジェクトのコレクションの拡張メソッドであるメソッドがあります。このメソッドは、コレクションを処理し、処理されたコレクションを返すことになっています。
処理操作によってオブジェクトが変更されたり、新しいオブジェクトが生成されたりすることはないため、そのメソッドからの出力を入力と同じタイプにする必要があります。
つまり、メソッドからの出力を、渡した実際の具象型ではなく、インターフェイス型のコレクションにしたくありません。
ただし、これにより、メソッドを呼び出すときに型推論で問題が発生します。
LINQPadの例で説明します。
これにより、次の2つのコンパイル時エラーが発生します。2つのメッセージを誘発するには、関連する行でコメントアウトする必要があります。
エラー1:
「Interval <int> []」に「Process」の定義が含まれておらず、「Interval <int> []」タイプの最初の引数を受け入れる拡張メソッド「Process」が見つかりませんでした(F4キーを押してディレクティブまたはアセンブリ参照を使用)エラー2:
メソッド'Extensions.Process <TInterval、T>(System.Collections.Generic.IEnumerable <TInterval>)'の型引数を使用法から推測できません。タイプ引数を明示的に指定してみてください。
その理由は、拡張メソッドが適合するかどうかを分析するときに、コンパイラが「十分に深く」見えていないためだと思います。
拡張方法を次のように変更した場合:
次にコンパイルしますが、出力は次のようになります。
ではなく:
もちろん、呼び出すときにタイプを指定すると、次のようになります。
...それで動作しますが、それだけではありません(IMO)。コンパイラーをだまして型を推測させる方法はありますか?
基本的に、私はしたい:
- 結果がインターフェースに入力される代わりに、メソッドを呼び出したタイプを取得します
- はい、これは確かにこれらの型を使用した別の呼び出しであるとコンパイラに伝え続ける必要はありません。これは、メソッドがLINQのような呼び出しチェーンの一部になるため、呼び出しごとに既知の型にキャストバックするか、呼び出しごとに完全な型を指定する必要があるためです。
java - 比較対象を格納する汎用 Java クラス
私は、同等のものを格納する汎用Javaクラスを持っています:
Person という抽象クラスもあります。
および 2 つの具象サブクラス、Professor と Student:
このように MyGenericStorage を作成しようとすると、エラーが発生します。
これは、ジェネリックの理解に根本的な問題があるためだと思います。誰かが私にこれを説明できますか、また、それを修正する方法はありますか?
編集:
MyGenericStorage を次のように変更しました。
そして今、それはうまくいくようです。誰かが理由を説明できますか?
scala - ネストされた汎用コード内のマニフェストからの Scala インスタンス化
「ジェネリック コール スタックにマニフェストをアタッチする」方法を理解できれば (Joshua が「Scala in Depth」のセクション 7.2.2 で書いているように)、それらの行に沿って B をインスタンス化できるでしょうか?:
または、ビューをバインドする必要がありますか?