問題タブ [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 - serializable のようなマーカー インターフェイスにデフォルト メソッドを含めることはできますか?
マーカーインターフェイスの原則はメソッドを持たないため、できないと思いますが、デフォルトのメソッドは抽象的ではないため、わかりません。
java - Java 8 が非公開のデフォルト メソッドを許可しないのはなぜですか?
例を見てみましょう:
簡単に言えば、これはHello world!
. たとえば、データ ファイルを初期化し、実装クラスを離れてはならTesterface#example
ない機密内部値を返すなどです。Java がデフォルトのインターフェースメソッドでアクセス修飾子を許可しないのはなぜですか? それらを保護/非公開にすることができず、サブクラスによって潜在的に昇格できないのはなぜですか (親クラスを拡張するクラスがオーバーライドされたメソッドに対してより目に見える修飾子を使用できる方法と同様です)?
一般的な解決策は抽象クラスに移行することですが、私の特定のケースでは、列挙型のインターフェイスがあるため、ここでは当てはまりません。私はそれが見過ごされたか、インターフェースの背後にある元のアイデアが利用可能なメソッドの「契約」であるためだと思いますが、これで何が起こっているのかについての情報が欲しいと思います.
「 Java 8 インターフェイスメソッドで「final」が許可されないのはなぜですか? 」を読みました。
デフォルト メソッドの基本的な考え方は、デフォルトの実装を持つインターフェイス メソッドであり、派生クラスがより具体的な実装を提供できることです。
そして、可視性がその側面をまったく壊さないように思えます。
リンクされた質問と同様に、クローズするのに問題があるように見えるため、意見に基づくものではなく、この問題について信頼できる回答をいただければ幸いです。
java - 2 つのインターフェースに同じデフォルト メソッドが含まれているとどうなりますか?
同じデフォルトメソッドを持つ2つのインターフェースがあり、両方がクラスで実装している場合/ このプログラムを参照してください。
じゃあどうなるの?また、このプログラムで無関係なエラーが発生しています。
java - mockito (1.10.17) をインターフェイスのデフォルト メソッドで動作させることはできますか?
私はmockitoの大ファンですが、残念ながらJava 8を使用する私のプロジェクトの1つでは失敗します...
シナリオ:
残念ながら、テストは失敗し、foo.bar()
0 が返されます。
行のコメントを外すとwhen()
、スタック トレースが表示されます...
これは、maven で利用可能な最新の安定版です。グーグルで調べても、Java 8 のこの新機能に関する mockito のステータスについてはあまりわかりませんでした...
インターフェイスを実装する以外の方法で動作させることはできますかspy()
(これは動作します)?
java - Java 8 のデフォルト メソッドの可読性
Java 8 では、デフォルト メソッドの概念が導入されています。デフォルトのメソッドを持つ次のインターフェースを考えてみましょう:
そして、このインターフェースを実装するクラス:
での次の呼び出しの可読性について質問がありますmayOrMayNotImplementThisMethod
。
上記の呼び出しでインターフェイス名を明示的に指定する理由は、クラスによって実装された複数のインターフェイスが同じメソッドを持つ場合の混乱を避けるためであることを理解しています。私が理解していないのは、super
このコンテキストでのキーワードの意味です。と言うときIDefaultMethod.super
、ここでは正確に何を指していますか? IDefaultMethod.mayOrMayNotImplementThisMethod() は IDefaultMethod.super.mayOrMayNotImplementThisMethod() よりも読みやすいでしょうか? super キーワードを削除すると、静的メソッド呼び出しと非静的メソッド呼び出しを区別するという犠牲を払って読みやすくなります。
interface - Java8 オーバーライド (拡張) デフォルト メソッド
インターフェイスにデフォルトのメソッドがあるとします。クラスの実装で、デフォルトのメソッド以外に追加のロジックを追加する必要がある場合、メソッド全体をコピーする必要がありますか? デフォルトのメソッドを再利用する可能性はありますか...抽象クラスで行うように
java - JDiagram の古いバージョンは、ExtendedArrayList.sort で JRE 8 で StackOverflowError をスローします。
以下のようにJDiagram JARを使用しています
このコードは、JRE 7 で実行すると正常に動作しますが、JRE 8 で実行すると、次のエラーがスローされます。
JDiagram の逆コンパイル コードまでスタック トレースをたどりました。routeAllLinks() が別のオブジェクト (ルーターなど) で RouteLinks() を呼び出し、さらに 1 つ深いレベルで、エラー スタック トレースに表示される ExtendedArrayList.sort() が呼び出されることが観察されました。JDiagram の「ExtendedArrayList」は ArrayList を拡張し、次の定義を持つ「sort()」という名前のメソッドを含みます。
Google で、JRE 8 が List.sort() を導入し、Collections.sort() 呼び出しをコレクション (私の場合は ExtendedArrayList) の並べ替えメソッドに委任することがわかりました。そのため、ライブラリ ExtendedArrayList.sort() がオーバーライドになりました。そして、スタックオーバーフローを引き起こす無限再帰を作成します。小さなコードでもこの問題を再現できました。
また
- JDiagram オブジェクトを作成する元のクラスは、製品の他のコンポーネントによって実行時にロードされます。プログラムのロードをほとんど制御できません。
- JDiagram の最新バージョンでは、sort() メソッドを sortJ7() メソッドに置き換えることでこの問題が修正されていることがわかりました。ただし、現時点ではライブラリをアップグレードできません。JDiagram はライセンスされた API です。
- ExtendedArrayList は JDiagram によって内部的にインスタンス化されているため、コードから変更することはできません。
これまでに機能しなかった次のソリューションを試しました
- Java プロキシ: 私たちのコードは ExtendedArrayList を直接呼び出さず、'Diagram' にはインターフェイスがないためです。
- Spring AOP: Spring を使用しておらず、プログラムは他のコンポーネントによって実行時に読み込まれます。
- AspectJ: 今では、これは明らかに解決策でした。ただし、実行時にプログラムを織り込むことができないため、これも機能しませんでした。誰かがそれを機能させることができるかどうかはわかりません。
補足が必要な点があれば教えてください。どんな助けでも大歓迎です。ありがとう。
更新 これまでのところ、javassist が最良のアプローチですが、JDiagram の難読化により、ソリューションが正しく機能しません。私たちは、リリース日を頭の中で考えると、修正することは不可能 (と言わざるを得ない) であると想定しています。ライブラリをアップグレードするプロセスを開始しました。その間、routeAllLinks() メソッドによって提供されていたアプリケーションから小さな機能を削除しました.. :-( 皆さんの助けに感謝します. この問題は本当に興味深く、挑戦的であることがわかったので、この問題に関する研究を続けます.. 「解決できたら投稿を更新します..そして、研究を続けているので、@gontard の javassist アプローチに対して報奨金を与えます.ありがとう.