問題タブ [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.

0 投票する
5 に答える
15154 参照

java - インターフェイスにデフォルトのコンストラクターを追加する方法はありますか

デフォルトのメソッドがJava 8に追加されたので、デフォルトのコンストラクタを作成する方法はありますか?

私はもう試した:

<identifier> expectedNetbeans からエラーを取得する

必要な理由 私は Gson を使用してオブジェクトをシリアル化し、「引数なしのコンストラクターを呼び出すことができません..」というエラーを取得しています。Gson のInstanceCreatorを使用してこの問題を解決できることはわかっています。しかし、デフォルトのコンストラクタを作成する方法はありますか?

アップデート

私は自分のコードで問題を発見しました。使っていました

それ以外の

そのため、サブクラスにはデフォルトのコンストラクターがありましたが、逆シリアル化コードは正しくありませんでした。しかし、デフォルトのコンストラクタの問題は依然として残っています。

0 投票する
1 に答える
232 参照

java - スーパーインターフェースのデフォルトメソッドを呼び出すことは可能ですか?

2 つのクラスがあるAとしBます。

Bとしてインスタンス化した後、のメソッドを のようbに呼び出すことができます。のメソッド呼び出しのメソッドを で作成することもできます。しかし、インターフェースが次の場合はどうでしょうか。Bb.method()BAsuper.method()A

Bのメソッドを のメソッドを呼び出す方法はありAますか?

0 投票する
1 に答える
289 参照

java - サブインターフェースはデフォルトメソッドの競合に対する解決策ですか?

が と の両方をLinkedList<E>実装している実際のユース ケースを抽出した次のコードを考えてみましょう。List<E>Deque<E>

両方のインターフェイスにsize()isEmpty()メソッドがあり、isEmpty()に関してメソッドをデフォルトにすることができますsize()

Java 8はまだそれをしていないので、それを(ダミーインターフェースで)やってみましょう:

おっとっと!でコンパイル時エラーが発生します。使用する実装LinkedListがわからないisEmpty()ため、次のように追加します。

メソッドを記述するのに以前と同じくらい多くのコードが必要になるため、このユースケースのデフォルトメソッドの利点は実質的にすべて失われましisEmpty()た。

しかし、それは解決できますか?はい!

次の実装を検討してください。

だから質問

  • これは、私たちとJDKが将来の実装でそれを処理することになっている方法ですか?
0 投票する
4 に答える
8431 参照

java - 既定のメソッドを持つインターフェイスはいつ初期化されますか?

この質問に答えるために Java 言語仕様を検索しているときに、私は次のことを知りました。

クラスを初期化する前に、その直接のスーパークラスを初期化する必要がありますが、クラスによって実装されるインターフェイスは初期化されません。同様に、インターフェイスのスーパーインターフェイスは、インターフェイスが初期化される前に初期化されません。

好奇心で試してみたところ、予想通り、インターフェースInterfaceTypeは初期化されませんでした。

このプログラムは印刷します

ただし、インターフェイスでdefaultメソッドが宣言されている場合は、初期化が行われます。InterfaceType次のように与えられたインターフェースを考慮してください

次に、上記の同じプログラムが印刷されます

つまり、staticインターフェイスのフィールドが初期化され (詳細な初期化手順のステップ 9 )、static初期化される型の初期化子が実行されます。これは、インターフェースが初期化されたことを意味します。

これが起こるべきであることを示すものを JLS で見つけることができませんでした。誤解しないでください、実装クラスがメソッドの実装を提供しない場合にこれが発生する必要があることは理解していますが、そうである場合はどうなりますか? この条件が Java 言語仕様に欠けているのでしょうか、何か抜けているのでしょうか、それとも間違って解釈しているのでしょうか?

0 投票する
2 に答える
27499 参照

java - Java 8 インターフェイス メソッドで「同期」が許可されない理由は何ですか?

Java 8 では、次のように簡単に記述できます。

クラスでも使用できる完全な同期セマンティクスを取得します。synchronizedただし、メソッド宣言で修飾子を使用することはできません。

ここで、 onと onのコントラクトInterface2を確立することを除いて、2 つのインターフェイスは同じように動作すると主張できます。これは、コントラクトよりも少し強力です。もちろん、実装は具体的な実装状態について仮定を行うべきではない、またはそのようなキーワードは単にその重みを引き出すことができないと主張することもできます。method1()method2()Interface1default

質問:

synchronizedJSR-335 専門家グループがインターフェイス メソッドをサポートしないことにした理由は何ですか?

0 投票する
4 に答える
3960 参照

java - Javaのデフォルトメソッドが機能しない

私は最近 Java にアップグレードし、インターフェイスの新しいデフォルト メソッドを試しています。ただし、トークン「デフォルト」で構文エラーが発生し続けます。このトークンを削除してください。問題が発生すると予想されるビルドパスは次のとおりです。 ここに画像の説明を入力]![[1]

ビルドパスと関係があると思われますが、何がわかりません。それが私のコードと関係がある場合、ここに私が試しているコードがあります:

誰かアイデアはありますか?

0 投票する
5 に答える
21608 参照

java - Java8: java.lang.Object からメソッドのデフォルト メソッドを定義することが禁止されているのはなぜですか?

デフォルトのメソッドは、Java ツールボックスの優れた新しいツールです。defaultただし、メソッドのバージョンを定義するインターフェイスを作成しようとしましたtoString。で宣言されたメソッドはedでjava.lang.Objectはない可能性があるため、Java はこれが禁止されていることを教えてくれます。defaultこれはなぜですか?

「基本クラスは常に勝つ」というルールがあることを私は知っているので、デフォルトでは(駄洒落;)、メソッドdefaultの実装はいずれにせよObjectからのメソッドによって上書きされObjectます。Objectただし、仕様のメソッドに例外があってはならない理由はわかりません。特にtoString、デフォルトの実装があると非常に便利な場合があります。

defaultでは、Java 設計者が からのメソッドをオーバーライドするメソッドを許可しないことにした理由は何Objectですか?