タグ付けされた質問 「type-erasure」

11
Scalaで型消去を回避するにはどうすればよいですか?または、なぜコレクションの型パラメーターを取得できないのですか?
Scalaでの悲しい事実は、List [Int]をインスタンス化すると、インスタンスがListであること、およびその個々の要素がIntであることを確認できますが、それがList [ Int]、簡単に確認できるように: scala> List(1,2,3) match { | case l : List[String] => println("A list of strings?!") | case _ => println("Ok") | } warning: there were unchecked warnings; re-run with -unchecked for details A list of strings?! -uncheckedオプションは、型の消去を非難します。 scala> List(1,2,3) match { | case l : List[String] => …

17
Javaでジェネリック配列型を作成できない理由は何ですか?
Javaが私たちに許可しない理由は何ですか private T[] elements = new T[initialCapacity]; .NETではそれを行うことができなかったことを理解できました..NETではランタイムに異なるサイズを持つことができる値型がありますが、Javaではすべての種類のTがオブジェクト参照になるため、同じサイズになります(私が間違っている場合は修正してください)。 理由は何ですか?

7
Javaジェネリック型の消去:いつ、何が起こりますか?
OracleのWebサイトで Javaの型消去について読みました。 型消去はいつ発生しますか?コンパイル時または実行時ですか?クラスが読み込まれると?クラスがインスタンス化されるのはいつですか? 多くのサイト(上記の公式チュートリアルを含む)では、型の消去はコンパイル時に行われるとしています。コンパイル時に型情報が完全に削除された場合、ジェネリックを使用するメソッドが型情報なしまたは誤った型情報で呼び出された場合、JDKはどのように型の互換性をチェックしますか? 次の例を考えてみます。クラスAにメソッドがあるとしempty(Box<? extends Number> b)ます。A.javaクラスファイルをコンパイルして取得しますA.class。 public class A { public static void empty(Box<? extends Number> b) {} } public class Box<T> {} 次に、パラメーター化されていない引数(rawタイプ)を使用しBてメソッドを呼び出す別のクラスを作成します。クラスパスでコンパイルすると、javacは十分に賢く警告を発します。だから、持ってそれに保存されているいくつかのタイプの情報を。emptyempty(new Box())B.javaA.classA.class public class B { public static void invoke() { // java: unchecked method invocation: // method empty in class A is applied to …

6
型消去テクニック
(型消去とは、Boost.Anyのように、クラスに関する型情報の一部またはすべてを非表示にすることを意味します。) 型消去の手法を手に入れながら、私が知っている手法を共有したいと思っています。私の希望は、誰かが彼/彼女の最も暗い時間に考えたいくつかのクレイジーなテクニックを見つけることです。:) 私が知っている、最初で最も明白で一般的に採用されているアプローチは、仮想関数です。クラスの実装をインターフェースベースのクラス階層内に隠すだけです。多くのBoostライブラリがこれを実行します。たとえば、Boost.Anyはこれを実行してタイプを非表示にし、Boost.Shared_ptrはこれを実行して(割り当て解除)割り当てメカニズムを非表示にします。 次にvoid*、Boost.Functionがファンクタの実際の型を非表示にするように、実際のオブジェクトをポインタに保持しながら、テンプレート化された関数への関数ポインタを持つオプションがあります。実装例は質問の最後にあります。 それで、私の実際の質問のために: あなたは他にどんなタイプの消去テクニックを知っていますか?可能な場合は、サンプルコード、使用例、それらについての経験、および詳細を読むためのリンクを提供してください。 編集 (これを回答として追加するか、質問を編集するだけか確信が持てなかったので、安全 な方法を実行します。)仮想関数や操作なしで何かの実際のタイプを非表示にするもう1つの優れた手法void*は、 1つのGManがここで採用しています。これがどのように機能するかについての私の質問に関連しています。 コード例: #include <iostream> #include <string> // NOTE: The class name indicates the underlying type erasure technique // this behaves like the Boost.Any type w.r.t. implementation details class Any_Virtual{ struct holder_base{ virtual ~holder_base(){} virtual holder_base* clone() const = 0; }; template<class …
136 c++  type-erasure 

11
Javaの型消去の利点は何ですか?
今日私は言ったつぶやきを読みました: Javaユーザーが型の消去について文句を言うのはおかしいです。これは、Javaが正しくなった唯一のものであり、間違ったものはすべて無視しています。 したがって、私の質問は: Javaの型消去のメリットはありますか?下位互換性とランタイムパフォーマンスのためのJVM実装設定以外に(おそらく)提供する技術的またはプログラミングスタイルの利点は何ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.