問題タブ [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 デフォルト インターフェース メソッドの Spring Integration @ServiceActivator
@ServiceActivator
Java 8 のデフォルト インターフェイス メソッドでアノテーションを使用したいと考えています。この既定のメソッドは、ビジネス ルールに応じて、このインターフェイスの別のメソッドに委任されます。
このインターフェースは、Spring@Service
クラスによって実装されます。
コードを実行すると、これは機能しません!
デフォルトメソッドからアノテーションを削除@ServiceActivator
し、クラスでそのデフォルトメソッドをオーバーライドし@Service
てスーパーメソッドに委譲するためにのみ機能させることができます。
デフォルト メソッドをオーバーライドすると、デフォルト メソッドの目的が無視されます。
このシナリオをクリーンな方法で実装する別の方法はありますか?
java - Java 8 への拡張メソッドの使用サイト注入を許可しないという設計上の考慮事項は何ですか?
防御メソッドおよび「仮想拡張メソッド」とも呼ばれるデフォルト メソッドがあります。
私はデフォルト メソッドの多大な価値を高く評価していますが (ある面では C# メソッドよりもさらに強力です)、ソース コードにアクセスせずに既存のインターフェイスを拡張することを許可しないという決定は何だったのだろうかと思います。
SO での彼の回答の 1 つで、 Brian Goetz は、既定のメソッドは利便性とインターフェイスの進化のために非常に設計されていると述べました。したがって、インターフェイスを作成すると、通常は別のクラスに配置する必要があるあらゆる種類のユーティリティ メソッドをそこに詰め込むことができます。それでは、さらに一歩進んで、私たちの管理下にないインターフェースにそれを許可してみませんか?
debugging - Java デバッガーが一部のデフォルト メソッド実装を呼び出せない
IntelliJ IDEA でコーディングしています。アプリケーションをデバッグするとき、 Watchesでいくつかのデフォルト メソッドの実装を使用できません。
要約された例を次に示します。
メソッドではmain()
、ブレークポイントを設定し、3 つのウォッチを設定します。
最初のウォッチは、メソッドが存在しないNoSuchMethodException
という不平をスローします。Friendship$BasicFriend.sayHiTo()
{java.lang.Integer@537} "2"
2 番目のウォッチは正常に実行されますが、不思議なことに、単にプリミティブではなく、ボックス化されたオブジェクトが報告されます
2
。
3 番目のウォッチは、予想どおりプリミティブ 1 を報告します。
最初の時計が機能しないのはなぜですか? これはバグですか?これは実際にIDEに関連していますか?デフォルトメソッドの概念上の欠陥が原因ですか? そもそも私が望むように機能する必要がありますか?2 回目のウォッチの奇妙な結果は、1 回目のウォッチの問題と何らかの関係がありますか?
java - 機能的インターフェースの継承の癖
私はしばらくの間、次のようなカスタム インターフェイスを使用してきました。
Function
このインターフェースを Javaと Guava の両方で改造したいのですFunction
が、FunctionalInterface
. 私は完璧な配置を持っていると思いました:
両方のスーパーインターフェースが同じapply()
メソッドを宣言します。これは私のインターフェースに実装されており、抽象call()
メソッドだけが残されています。奇妙なことに、それはコンパイルされません。
「@FunctionalInterface」注釈が無効です。Function<T,R> は関数型インターフェースではありません
さらに奇妙なことに、次のバリエーションは問題なくコンパイルされます。
最初のバージョンがコンパイルされない理由はありますか?
java - ikvm-from dll ライブラリを使用して C# に実装されていない Gephi の Java デフォルト メソッド
私は Java に関する知識がほとんどないため、問題を誤解している可能性があります。
私は Java の Gephi API に取り組んでおり、IKVMC を使用して dll を操作しました。
Gephi doc https://github.com/gephi/gephi/wiki/How-to-manipulate-Graphで説明されているように、空のグラフを作成しようとしました
C#で私はこれを試しました:
2 行目に次のエラーが表示されます。
Exception non gérée : System.TypeLoadException: La method 'thenComparing' du type 'org.openide.util.lookup.ALPairComparator' de l'assembly 'gephi-toolkit, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null 'n'a pas d'implémentation. org.openide.util.lookup.AbstractLookup.getPairsAsLHS() à org.openide.util.lookup.MetaInfServicesLookup.beforeLookup(Template ) à org.openide.util.lookup.AbstractLookup.lookupItem(Template template) à org.openide. util.lookup.AbstractLookup.lookup(Class clazz) à org.openide.util.Lookup.getDefault() à myproject ....
英語では、thenComparing() メソッドには org.openide.util.lookup.ALPairComparator 型の実装がないことがすぐにわかります。
私はいくつかの調査を行い、逆コンパイルされたdllで、エラーはここにあるようです
thenComparing は「デフォルト」のメソッドであることがわかりました。Java 8 では、間違いを言わなければ、デフォルトのメソッドがすでに実装されています。
私のプロジェクトには、IKVM の java.util ライブラリへの参照があります。
したがって、デフォルト メソッドの実装が ikvm を使用して C# で適切にサポートされていないか、thenComparing がタイプ internal ALPairComparator を適切にサポートしていないことが問題である可能性があります。
それがどこから来たのかはよくわからないので、手がかりがあれば歓迎します。質問がある場合、またはさらに精度が必要な場合は、私に尋ねてください。
ご協力ありがとうございました。
編集: Gephi は Java 1.8 と互換性がなく、Java 1.7 と互換性があることに気付きました
EDIT2: dll 内の org.openide.util パッケージを、IlSpy を使用する Java 1.7 の以前のバージョンに置き換えようとしています。
java - Java 8 を使用したテンプレート メソッドの設計パターン
Java 8 の新しいデフォルト メソッドを使用してテンプレート メソッドをリファクタリングしたいと考えています。抽象クラスでプロセス定義のフローがあるとします:
上記のフローマネージャーを拡張するサブクラスはほとんどなく、各サブクラスは独自のメソッドを実装していphase1
ますphase2
。次のようなインターフェイスにコードをリファクタリングすることに意味があるのだろうか。
どう思いますか?