タグ付けされた質問 「generics」

メタ手法。これにより、依存型の設定をランタイムに移すことができます。


7
Javaのジェネリックの何が問題になっていますか?[閉まっている]
このサイトで、Javaによるジェネリックの実装を非難する投稿を何度か見ました。今、私は正直に言って、私はそれらを使用することに何の問題もなかったと言うことができます。しかし、私は自分でジェネリッククラスを作成しようとしませんでした。では、Javaの汎用サポートに関する問題は何ですか?
49 java  generics 

6
Javaコレクションを意味のあるクラス名でマスクする良い習慣か悪い習慣ですか?
最近、私は人間に優しいクラス名でJavaコレクションを「マスキング」する習慣を身につけています。いくつかの簡単な例: // Facade class that makes code more readable and understandable. public class WidgetCache extends Map<String, Widget> { } または: // If you saw a ArrayList<ArrayList<?>> being passed around in the code, would you // run away screaming, or would you actually understand what it is and what // it …

4
ジェネリック乱用とは何ですか?
いくつかのコードをレビューしているときに、ジェネリックを使用するように変更する機会に気付きました。(難読化された)コードは次のようになります。 public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets) { var someProperty = typeOfTarget.GetProperty(possibleTargets[0]); ... } このコードは、次のようにジェネリックに置き換えることができます。 public void DoAllTheThings<T>(object[] possibleTargets[0]) { var someProperty = type(T).getProperty(possibleTargets[0]); ... } このアプローチの利点と欠点を研究する際に、ジェネリック乱用と呼ばれる用語を見つけました。見る: 未開始(開発者)をジェネリックから保護する https://stackoverflow.com/questions/28203199/is-this-an-abuse-of-generics https://codereview.stackexchange.com/q/60695 私の質問は2つの部分に分かれています。 このようなジェネリックに移行する利点はありますか?(パフォーマンス?可読性?) ジェネリック乱用とは何ですか?そして、パラメータの種類があり、一般的なすべての時間を使用している乱用は?
35 generics 

12
汎用オブジェクトをコンテナに保存してからオブジェクトを取得し、コンテナからオブジェクトをダウンキャストするのはコードの匂いですか?
たとえば、プレーヤーの能力を高めるためのいくつかのツールを備えたゲームがあります。 Tool.h class Tool{ public: std::string name; }; そしていくつかのツール: Sword.h class Sword : public Tool{ public: Sword(){ this->name="Sword"; } int attack; }; Shield.h class Shield : public Tool{ public: Shield(){ this->name="Shield"; } int defense; }; MagicCloth.h class MagicCloth : public Tool{ public: MagicCloth(){ this->name="MagicCloth"; } int attack; int defense; }; …

3
適切な汎用型システム
Javaジェネリックがいくつかの重要な方法で失敗したことは一般に受け入れられています。ワイルドカードと境界の組み合わせにより、いくつかの深刻な読み取り不能コードが発生しました。 しかし、他の言語を見ると、プログラマが満足している一般的な型システムを見つけることができないようです。 このような型システムの設計目標として次を採用する場合: 常に読みやすい型宣言を生成します 簡単に習得できます(共分散、反分散などをブラッシュアップする必要はありません) コンパイル時エラーの数を最大化します それを正しくした言語はありますか?私がグーグルで見た場合、私が見る唯一のことは、型システムが言語Xをどのように吸うかについての苦情です。この種の複雑さはジェネリック型に固有のものですか?コンパイル時に型安全性を100%検証しようとするのをあきらめるだけですか? 私の主な質問は、これらの3つの目標に関して最も「うまくいく」言語です。私はそれが主観的であることを認識していますが、これまでのところ、すべてのプログラマーが汎用型システムが混乱していることに同意するわけではない言語を見つけることさえできません。 補遺:前述のように、サブタイピング/継承とジェネリックの組み合わせが複雑さを引き起こすので、両方を組み合わせ、複雑さの爆発を回避する言語を本当に探しています。

8
C#Generics-冗長な方法を避ける方法
次のような2つのクラスがあると仮定しましょう(コードの最初のブロックと一般的な問題はC#に関連しています)。 class A { public int IntProperty { get; set; } } class B { public int IntProperty { get; set; } } これらのクラスは、いかなる方法でも変更できません(これらは、サードパーティアセンブリの一部です)。したがって、同じインターフェイスを実装したり、IntPropertyを含む同じクラスを継承したりすることはできません。 IntProperty両方のクラスのプロパティにいくつかのロジックを適用したいのですが、C ++ではテンプレートクラスを使用してそれを非常に簡単に行うことができました。 template <class T> class LogicToBeApplied { public: void T CreateElement(); }; template <class T> T LogicToBeApplied<T>::CreateElement() { T retVal; retVal.IntProperty = 50; return retVal; …
28 c#  generics 

1
<の違いは何ですか?Foo>および<Foo>を拡張します
私は、違いについて誤解があるようだ&lt;Foo&gt;とし&lt;? extends Foo&gt;。私の理解から、もしあれば ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); これは、タイプのオブジェクトFooをこの配列リストに追加できることを示します。のサブクラスFooもtype Fooであるため、次のようにエラーなしで追加できます。 ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); foos.add(new Foo()); foos.add(new Bar()); ここでBar extends Foo。 さて、私が定義されていたと言うfoosと ArrayList&lt;? extends Foo&gt; foos = new ArrayList&lt;&gt;(); 私の現在の理解はこれが表現するということsome unknown type that extends Fooです。これは、サブクラスであるオブジェクトFooをこのリストに追加できることを意味します。差がないことを意味ArrayList&lt;Foo&gt;してArrayList&lt;? extends Foo&gt;。 これをテストするために、次のコードを記述しようとしました ArrayList&lt;? extends Foo&gt; subFoos = new ArrayList&lt;&gt;(); subFoos.add(new Foo()); subFoos.add(new Bar()); …
20 java  generics 

3
ジェネリックと共通のインターフェース?
前回ジェネリッククラスを書いたときのことは覚えていません。何かを考えてから必要になると思うたびに、結論を出します。 この質問に対する2番目の答えは、明確化を求めることでした(まだコメントできないので、新しい質問をしました)。 ジェネリックが必要な場合の例として、与えられたコードを取り上げましょう。 public class Repository&lt;T&gt; where T : class, IBusinessOBject { T Get(int id) void Save(T obj); void Delete(T obj); } 型の制約があります: IBusinessObject 私の通常の考え方は次のとおりです。クラスはuse IBusinessObjectに制限されているため、これを使用するクラスもそうRepositoryです。リポジトリはこれらを保存します。IBusinessObjectほとんどの場合、これのクライアントはインターフェースをRepository介してオブジェクトを取得および使用したいと思うでしょうIBusinessObject。それではなぜ public class Repository { IBusinessOBject Get(int id) void Save(IBusinessOBject obj); void Delete(IBusinessOBject obj); } また、この例は、単なる別のコレクションタイプであり、ジェネリックコレクションはクラシックであるため、良くありません。この場合、型制約も奇妙に見えます。 実際、この例class Repository&lt;T&gt; where T : class, IBusinessbBjectはclass BusinessObjectRepository私によく似ています。これはジェネリックが修正するために作られたものです。 要点は、ジェネリックはコレクション以外のすべてに適しているので、クラス内でジェネリック型パラメーターの代わりにこの型制約を使用するように、型制約を特殊化することはありませんか?

4
誰がインターフェースを拡張しますか?なぜ?
知る限り、私のクラスのextends親クラスとimplementsインターフェース。しかし、私はを使用できない状況に出くわしますimplements SomeInterface。これは、ジェネリック型の宣言です。例えば: public interface CallsForGrow {...} public class GrowingArrayList &lt;T implements CallsForGrow&gt; // BAD, won't work! extends ArrayList&lt;T&gt; ここでの使用implementsは構文的に禁止されています。最初に、&lt;&gt;内でインターフェイスを使用することはまったく禁止されていると考えましたが、そうではありません。可能ですが、extends代わりに使用するだけ ですimplements。その結果、インターフェイスを「拡張」しています。この別の例は動作します: public interface CallsForGrow {...} public class GrowingArrayList &lt;T extends CallsForGrow&gt; // this works! extends ArrayList&lt;T&gt; 私にはそれは構文上の矛盾と思われます。しかし、Java 6の細かい部分を理解していないのかもしれません。インターフェイスを拡張する必要がある他の場所はありますか?私が拡張するつもりのインターフェースには、いくつかの特別な機能が必要ですか?

8
一般的なプログラミングに対する認識をチームメンバーに広めるにはどうすればよいですか?
私は人々が信じる環境にとどまっています: Javaジェネリックは、実際のコーディングではなく、ライブラリの書き込み専用に使用される機能です。 C ++はオブジェクト指向プログラミング言語です。templateオプションで回避可能な機能です ただし、これらの人々は、汎用プログラミング(STL、Javaコンテナーなど)を使用して作成されたライブラリーに大きく依存しています。templatesまたはを使用してコードを記述する場合generics、コードレビューアはそれを拒否する可能性が高く、「適切/理解可能/エレガント」な方法でそれを記述するようコメントします。 このような考え方は、通常のプログラマーから上級管理職まで適用できます。90%の時間、これらの人々はロビー活動をしているため、逃げ道はありません。 それらを説明する最良の方法(のどを切らない)、OOと汎用プログラミングの両方を同時に構成するコードを記述する実際的なアプローチは何ですか?
20 java  c++  templates  generics 

2
C#にnew()制約があるのに、他の同様の制約がないのはなぜですか?
C#ジェネリックでは、と言うことで、型パラメーターの制約を宣言Tしてデフォルトコンストラクターを持たせることができますwhere T : new()。ただし、このような他の種類の制約は有効ではありません- new(string)たとえば、など 言語設計および/または実装の観点から、この理由は何ですか? コンストラクタの動作方法や、これを禁止する(または少なくとも難しくする)型システムの実装方法に何かありますか?もしそうなら、それは何ですか?default(T)実際にコンパイルさnew T()れた場所を読んだことを思い出しT : structます。これと関係があるのでしょうか? それとも、言語が複雑になりすぎないようにするために、単に設計上の決定を下しただけですか?


2
上位のパラメトリック多型は有用ですか?
私は誰もがフォームの一般的なメソッドに精通していると確信しています: T DoSomething&lt;T&gt;(T item) この関数は、パラメータポリモーフィック(PP)、特にランク1 PP とも呼ばれます。 このメソッドは、次の形式の関数オブジェクトを使用して表現できるとしましょう。 &lt;T&gt; : T -&gt; T つまり、&lt;T&gt;1つの型パラメーターを受け取り、1つの型のパラメーターをT -&gt; T受け取りT、同じ型の値を返すことを意味します。 その場合、次はランク2 PP関数になります。 (&lt;T&gt; : T -&gt; T) -&gt; int この関数は、型パラメーター自体を受け取りませんが、型パラメーターを受け取る関数を受け取ります。これを繰り返し続けて、ネストをより深くし、より高いランクのPPを取得できます。 この機能は、プログラミング言語では非常にまれです。Haskellでさえ、デフォルトでは許可していません。 便利ですか?他の方法では説明が難しい動作を説明できますか? また、何かが命令的であるとはどういう意味ですか?(このコンテキストで)

3
ジェネリックはどのように実装されますか?
これは、コンパイラ内部の観点からの質問です。 テンプレート(C ++)ではなくジェネリックに興味があるため、質問にC#を付けました。なぜなら、両言語のジェネリックは実装が異なるためです。 ジェネリックなしの言語を見ると、非常に簡単です。クラス定義を検証し、階層に追加するだけです。 しかし、ジェネリッククラスをどうするか、さらに重要なことには、それへの参照をどのように処理するのでしょうか?インスタンス化ごとに静的フィールドが特異であることを確認する方法(つまり、ジェネリックパラメーターが解決されるたびに)。 私は電話を見たとしましょう: var x = new Foo&lt;Bar&gt;(); Foo_Bar階層に新しいクラスを追加しますか? 更新:これまでのところ、関連する投稿は2つしか見つかりませんでしたが、「自分でどうやってやるのか」という意味ではあまり詳しくありません。 http://www.jprl.com/Blog/archive/development/2007/Aug-31.html http://www.artima.com/intv/generics2.html
16 c#  generics 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.