11

次のようなコードスニペットを見ると

  interface A {
      void a();
      void b() default { System.out.println("b"); };
      void c() final { System.out.println("c"); };
  }

一つ質問があります。Javaで十分なsh*tをすでに取得していませんか?なぜこれが必要なのですか?

4

5 に答える 5

35

これが必要なのは、Scalaの人たちを絶対に激怒させるからです。それらはすでに「特性」の形でかなり類似した機能を持っているので、今度はそれらをこれらと一緒に機能させる必要があります。

Scalaの連中を怒らせることは、Java言語開発において文字通り最優先事項です。

于 2012-01-26T21:32:48.290 に答える
13

Java 8 には、何らかの形式のラムダとクロージャーのサポートが含まれることが計画されています。これは、Java 言語の近代化における大きな一歩となるでしょう。問題は、コレクション フレームワークなどのインターフェイスに基づく既存のライブラリが、これらの新しい機能を直接使用できないことです。既存の実装を壊さずにインターフェースにメソッドを追加することはできません。単純にコンパイルできなくなります。

ラムダを持っていても、標準コレクションで簡単に使用できないことは、Java 開発者にとって大きな失望となります。ラムダを標準コレクションに統合するにはforEach、 、map、または などのメソッドfilterが非常に望ましいでしょう。

この問題の解決策は、別の機能である拡張メソッドを追加することです。拡張メソッドは、インターフェイス内のメソッドの既定の実装を定義します。既存のサブクラスはデフォルトのメソッドを使用しますが、メソッドを特殊化されたより適切な実装でオーバーライドすることもできます。

拡張メソッドの提案の詳細については、Java Enhancement Proposal 126を参照してください。

于 2012-01-26T22:40:52.460 に答える
7

このカンファレンスをご覧になることをお勧めします: http://medianetwork.oracle.com/media/show/16999

これはすべてを説明します。最も興味深いのは、コードベース全体を書き直すことなくインターフェイスを進化させることです。これは、大規模なコードベースが進化し、ますます不自由にならないようにするための鍵です。

于 2012-02-03T14:33:12.740 に答える
3

これは、API 作成者が NoSuchMethodError を発生させずにインターフェイスを事後拡張できるため、優れています。また、V1 に対してコンパイルされたクラスの V2 のメソッドにデフォルトの実装を提供します。コードは魅力のように機能します。これにより、通常どおり V2 に対してコンパイルされたクラスでデフォルトの実装をオーバーライドすることもでき、番号付きインターフェイスが冗長になります。ユースサイト拡張法よりも優れていると思います。

于 2012-01-26T22:15:18.923 に答える
-1

「拡張メソッド」の概念は、「外部の世界」にさらされた、設計が不十分な API をハッキング/修正する最後のチャンスにすぎないと私は信じています。ただのシンタックスシュガー。

于 2012-01-26T21:29:17.367 に答える