問題タブ [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 - インターフェースのデフォルトメソッドですが、静的最終フィールドのみ
インターフェイスのすべてのフィールドが暗黙的にstatic および finalであることを理解しています。そして、これは Java 8 より前では理にかなっていました。
しかし、デフォルト メソッドの導入により、インターフェースも抽象クラスのすべての機能を備えています。したがって、非静的および非最終フィールドも必要です。
しかし、フィールドを普通に宣言しようとすると、デフォルトで static かつ final になりました。
Java 8 の Interface で非静的および非最終フィールドを宣言する方法はありますか。
それとも、ここで何かを完全に誤解していますか???
java - Java 8 JDK でのデフォルトのメソッドとその使用法の良い例はありますか?
仮想拡張メソッド (既定のメソッド) に関する公式声明では、次のように述べられています。
仮想拡張メソッド (既定のメソッド) の目的は、最初の公開後にインターフェイスを互換性のある方法で進化させることです。」</p>
これが実際に行われている JDK の良い例を見ることはできますか? これまでのところ、java.util.Collection
インターフェイスと他のいくつかを見つけましたが、より完全なリストがあると便利です.
編集:デフォルトの方法を使用することが安全かどうかを調べていませんでした(リンクされている質問をすでに読んでいるため)。JDKで実用的な例を探していました。
java - Java 8 の Stream API がデフォルトのメソッドを使用して実装されなかった理由
私は最近 Java 8 の Stream API を使い始めましたが、これは Java への大きな貢献だと思います。しかし、なぜこのように実装されたのかわかりません。
Java 8 のその他の最も優れた機能の 1 つは、インターフェースのデフォルト メソッドです。これにより、インターフェースにデフォルトの実装を持たせることができます。これらを使用すると、下位互換性を保ちながら、ストリーム API を介して提供されるすべてのメソッドとデフォルトの実装を Collection インターフェイスに与えることができます。.NET の LINQ に似た、より単純な構文が可能になるだけでなく、型を実装してこれらのメソッドの動作をオーバーライドすることもできます。毎回 stream() メソッドを呼び出す必要がなくなり、常に collect() メソッドを使用する必要がなくなります。
これは非常に一般的な質問であることは承知していますが、Java 8 の開発者が非常に残念な選択をしたように思われ、修正するのは非常に困難です。
java - スーパー クラス メソッドとインターフェイスのデフォルト メソッドの競合解決
以下の例を考えてみましょう。
ご覧のとおり、SupCls
クラスとIntf
インターフェイスの間に接続はありません。しかし、どちらも共通のメソッドを定義しています。
そしてTesting
クラスは拡張SupCls
して実装してIntf
います。
したがって、出力でtest()
メソッドを呼び出すと、Testing
クラスからの拡張は、インターフェイスからの実装よりも優先される必要があるため、これは理にかなっていると思います。
しかし、以下のスクリーン キャプチャに示すように、Eclipse はそうではないと報告します。
これはEclipseのバグであると強く信じています。
しかし、仮定する前に、この動作はJLSで定義および文書化されていますか? または、この動作を定義する何か他のものがありますか?
編集: Eclipse のバージョンはMars Release (4.5.0)です。
java - Java 8 で (デフォルトのメソッドを使用して) インターフェイスを実装する順序が問題になるのはなぜですか?
ご存じのようにinterfaces
、Java では複数を実装できます。それらの実装の順序は重要ですか? つまり、B、C は C、B と同じJava 8
ですか? 私のテストでは、順序が重要であることが示されていますが、この背後にあるロジックを説明できる人はいますか?
上記のコードは正常に動作します。順序B, C
をに変更するC, B
と、エラーが発生します。The default method display() inherited from B conflicts with another method inherited from C.
編集
私はEclipse(火星)を使用しています。JDK jdk1.8.0_51
. JRE jre1.8.0_60
。