問題タブ [default-method]
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 8に追加されたので、デフォルトのコンストラクタを作成する方法はありますか?
私はもう試した:
<identifier> expected
Netbeans からエラーを取得する
必要な理由 私は Gson を使用してオブジェクトをシリアル化し、「引数なしのコンストラクターを呼び出すことができません..」というエラーを取得しています。Gson のInstanceCreatorを使用してこの問題を解決できることはわかっています。しかし、デフォルトのコンストラクタを作成する方法はありますか?
アップデート
私は自分のコードで問題を発見しました。使っていました
それ以外の
そのため、サブクラスにはデフォルトのコンストラクターがありましたが、逆シリアル化コードは正しくありませんでした。しかし、デフォルトのコンストラクタの問題は依然として残っています。
java - スーパーインターフェースのデフォルトメソッドを呼び出すことは可能ですか?
2 つのクラスがあるA
としB
ます。
B
としてインスタンス化した後、のメソッドを のようb
に呼び出すことができます。のメソッド呼び出しのメソッドを で作成することもできます。しかし、インターフェースが次の場合はどうでしょうか。B
b.method()
B
A
super.method()
A
B
のメソッドを のメソッドを呼び出す方法はありA
ますか?
java - サブインターフェースはデフォルトメソッドの競合に対する解決策ですか?
が と の両方をLinkedList<E>
実装している実際のユース ケースを抽出した次のコードを考えてみましょう。List<E>
Deque<E>
両方のインターフェイスにsize()
とisEmpty()
メソッドがあり、isEmpty()
に関してメソッドをデフォルトにすることができますsize()
。
Java 8はまだそれをしていないので、それを(ダミーインターフェースで)やってみましょう:
おっとっと!でコンパイル時エラーが発生します。使用する実装LinkedList
がわからないisEmpty()
ため、次のように追加します。
メソッドを記述するのに以前と同じくらい多くのコードが必要になるため、このユースケースのデフォルトメソッドの利点は実質的にすべて失われましisEmpty()
た。
しかし、それは解決できますか?はい!
次の実装を検討してください。
だから質問:
- これは、私たちとJDKが将来の実装でそれを処理することになっている方法ですか?
java - 既定のメソッドを持つインターフェイスはいつ初期化されますか?
この質問に答えるために Java 言語仕様を検索しているときに、私は次のことを知りました。
クラスを初期化する前に、その直接のスーパークラスを初期化する必要がありますが、クラスによって実装されるインターフェイスは初期化されません。同様に、インターフェイスのスーパーインターフェイスは、インターフェイスが初期化される前に初期化されません。
好奇心で試してみたところ、予想通り、インターフェースInterfaceType
は初期化されませんでした。
このプログラムは印刷します
ただし、インターフェイスでdefault
メソッドが宣言されている場合は、初期化が行われます。InterfaceType
次のように与えられたインターフェースを考慮してください
次に、上記の同じプログラムが印刷されます
つまり、static
インターフェイスのフィールドが初期化され (詳細な初期化手順のステップ 9 )、static
初期化される型の初期化子が実行されます。これは、インターフェースが初期化されたことを意味します。
これが起こるべきであることを示すものを JLS で見つけることができませんでした。誤解しないでください、実装クラスがメソッドの実装を提供しない場合にこれが発生する必要があることは理解していますが、そうである場合はどうなりますか? この条件が Java 言語仕様に欠けているのでしょうか、何か抜けているのでしょうか、それとも間違って解釈しているのでしょうか?
java - Java 8 インターフェイス メソッドで「同期」が許可されない理由は何ですか?
Java 8 では、次のように簡単に記述できます。
クラスでも使用できる完全な同期セマンティクスを取得します。synchronized
ただし、メソッド宣言で修飾子を使用することはできません。
ここで、 onと onのコントラクトInterface2
を確立することを除いて、2 つのインターフェイスは同じように動作すると主張できます。これは、コントラクトよりも少し強力です。もちろん、実装は具体的な実装状態について仮定を行うべきではない、またはそのようなキーワードは単にその重みを引き出すことができないと主張することもできます。method1()
method2()
Interface1
default
質問:
synchronized
JSR-335 専門家グループがインターフェイス メソッドをサポートしないことにした理由は何ですか?
java - Javaのデフォルトメソッドが機能しない
私は最近 Java にアップグレードし、インターフェイスの新しいデフォルト メソッドを試しています。ただし、トークン「デフォルト」で構文エラーが発生し続けます。このトークンを削除してください。問題が発生すると予想されるビルドパスは次のとおりです。
ビルドパスと関係があると思われますが、何がわかりません。それが私のコードと関係がある場合、ここに私が試しているコードがあります:
誰かアイデアはありますか?
java - Java8: java.lang.Object からメソッドのデフォルト メソッドを定義することが禁止されているのはなぜですか?
デフォルトのメソッドは、Java ツールボックスの優れた新しいツールです。default
ただし、メソッドのバージョンを定義するインターフェイスを作成しようとしましたtoString
。で宣言されたメソッドはedでjava.lang.Object
はない可能性があるため、Java はこれが禁止されていることを教えてくれます。default
これはなぜですか?
「基本クラスは常に勝つ」というルールがあることを私は知っているので、デフォルトでは(駄洒落;)、メソッドdefault
の実装はいずれにせよObject
からのメソッドによって上書きされObject
ます。Object
ただし、仕様のメソッドに例外があってはならない理由はわかりません。特にtoString
、デフォルトの実装があると非常に便利な場合があります。
default
では、Java 設計者が からのメソッドをオーバーライドするメソッドを許可しないことにした理由は何Object
ですか?