問題タブ [erasure]
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.
scala - Scala: 存在型と型消去
私はscalaにあまり詳しくないので、私の質問が理にかなっていることを願っています:
私は複雑なパラメータ化されたクラスを持っていますが、それを次のように再開しましょう:
プログラムの別の部分で、次のようなものを構築したいと思います。
次のようなことができるようになりたいです。
しかし得る
型の不一致: 予想される _$1、実際: Int
TypeTags で解決できると思いますが、この件に関して私が見た資料を適応させることはできませんでした。ここで、Int によってパラメーター化されるはずの Foo に伝えたいと思います。
さらに、実際の使用例では、変数を取得します:
mylist(i) に一致することはわかっていますが、mylist(i) にある Foo[_] の型も x の型もわかりません。それでも私は次のようなことをしたいと思います:
または私の考えでは(ただし、これはscalaではほとんど意味がありません):
どうやってやるの ?
これに近い主題に関する投稿がたくさんあることは知っていますが、これを理解することはできません.
java - Java 消去はジェネリック配列にどのように影響しますか?
私はこの期間にジェネリックを勉強していますが、今日、私にとってこの謎を発見しました.
次のダミークラスを考えてみましょう:
消去のため、実行時に getArray() メソッドの T[] 戻り値の型が Object[] に変換されます。これは私にとって完全に合理的です。
そのメソッドにそのままアクセスする場合 (c.getArray()) 例外はスローされませんが、返された配列でいくつかのメソッド (c.Array().getClass() など) を呼び出そうとすると、またはc.getArray().length などのフィールドにアクセスすると、次の例外がスローされます。
スレッド「メイン」での例外 java.lang.ClassCastException: [Ljava.lang.Object; [Ljava.lang.Integer; にキャストできません。
この例外がスローされるのはなぜですか? 単純な c.getArray() 呼び出しでもスローされないのはなぜですか? 単に getClass() を呼び出しているか、長さにアクセスしているのに、なぜ Integer[] にキャストしようとしているのですか? getClass() と length は Object[] でも利用できませんか?
あなたの多くの(私は願っています)そして説明的な(私もこれを願っています)答えを前もって感謝します。
scala - 抽象型 T は、消去によって削除されるため、チェックされていません
Java クラスを拡張する Scala クラスを作成しています。この抽象 Java クラスにはいくつかのコンバーターが含まれているため、拡張する必要があります。また、フレームワークにプラグインできる独自のコンバーターを作成する必要があります。したがって、以下のメソッドの署名は私に強制されます。クラスが抽象クラスを拡張すると言うと、Eclipse によって自動的に生成されます。メソッドのシグネチャを変更しようとすると、「親からの抽象メソッドを実装していない」ため、クラスはコンパイルに失敗します。
もちろん、メソッドの実装は私の選択ですが、型システムの制約を満たすことができないことがわかりました。
私は非常に単純なことをする必要があります: "None" を null として扱い、それ以外はそのまま返します。しかし、タイプセーフな方法ではこれを行うことができないことがわかりました。以下のようなコードを書くと、「抽象型 T は消去により消去されるため未チェックです」という警告が出ます。どうすればそれをなくすことができますか?
また、消去が適用された場合、コードがどのように見えるか、つまり、2 番目の "if" 条件がどのようになるかについても考えています。
直感的に、入力が Any の場合に T を返すことを保証できないことを理解しています。これが、コンパイラが不満である理由です。実際には、文字列を読み取って文字列を返すだけなので、これは機能しますが、メソッドのシグネチャは継承宣言によって強制されます。
このメソッドを実装するにはどうすればよいですか?
java - 異なるメッセージ オブジェクトを持つ Hazelcast MessageListener を実装するクラスでの Java 消去の競合
現在 Hazelcast 3.0 を使用しており、異なるメッセージ オブジェクトで異なるトピックをセットアップしようとしています。複数のトピックをリッスンできるクラスが必要ですが、onMessage() メソッドが異なるため、それがどのように可能かわかりません。同じ消去。これが私の Hazelcast 構成クラスです。
次に、たとえば、メッセージ オブジェクトの 1 つに基づいてトピックをリッスンするスーパークラスがあります。
次に、2 番目のタイプのメッセージ オブジェクトをリッスンするサブクラス:
しかし、ご覧のとおり、これは許可されていません。これは、両方とも MessageListener を実装しているスーパークラスとサブクラスの間に消去の競合があるためですが、異なるタイプの MessageObject クラスに対してです。また、両方のタイプのメッセージをリッスンする 1 つのクラスが必要な場合もあることに注意してください。これは、消去の競合のためにも機能します。
何か不足していますか?これは、Hazelcast を使用してトピックとリスナーを作成するための通常のシナリオではありませんか? 実装をクリーンに保ち、メッセージをイントロスペクトしてメッセージのタイプを評価する必要がないようにしたいと思います。Hazelcast はクリーンなデザインを作成していないように思えますが、トピック、メッセージ、およびリスナーの設定方法が不足している可能性があります。正しく。これを解決する方法を理解するのを手伝ってください。
java - Java 1.6 -> 1.8、同じ消去コンパイル エラー
Java アプリを 1.6 から 1.8 に移植していますが、コンパイラはgetAbstractTransactionCriteria()
次のコードのメソッドに満足していません。
Object
コンパイラは、2 つのメソッドの消去が同じであることを教えてくれます。山かっこ内のものがコンパイラによって置き換えられることを他の場所で見たので、これを受け入れることができます。
引数c
はポリモーフィズムを実現するためだけにあり (メソッド本体では使用されません)、これは Java 1.6 で完全に機能していました。
1.8 で同じ結果を得るにはどうすればよいですか?
java - 同じ消去による名前の衝突
私は次のようなインターフェースを持っています
次のエラーが表示されます
エラー:(44, 10) エラー: 名前の衝突: IDrawerItem の bindView(VH#1,List) と IItem の bindView(VH#2,List) には同じ消去がありますが、どちらも VH#1,VH# で他のものをオーバーライドしません2 は型変数です。VH#1 はインターフェイス IDrawerItem で宣言された ViewHolder を拡張します VH#2 はインターフェイス IItem で宣言された ViewHolder を拡張します
どうしてこんなことに?
c - C言語に型消去の概念はありますか?
C言語のどこかで型消去のテクニックが使われているのだろうか。型キャストが行われると、C で何が起こりますか? 型消去やダウンキャストに似た概念を使用していますか?
型消去と型キャストの主な違いは何ですか?
java - さまざまなタイプのジェネリックを保証する
同じメソッド名を使用してT
オブジェクトをオブジェクトに変換する汎用コンバーター インターフェイスを作成しようとしています。U
convert
もちろん、ジェネリック消去は、コンパイル中に両方のメソッドを次のように変換します。
したがって、どちらの方法でも同じ消去が行われるため、コンパイル中にエラーが発生します。
私の例では、 と に対して常に異なるオブジェクト タイプを使用することは論理的T
ですU
。T
同じメソッド名 (convert) を保持し、とU
が異なる型であるという事実をカプセル化し、それぞれの場合に適切なメソッドが確実に呼び出されるようにする方法はありますか?