2つのメソッドを使用した@FunctionalInterfaceのコンパイルエラーがないのはなぜですか?


8

以下のインターフェースはJava 8の有効な機能インターフェースですか?

@FunctionalInterface
interface Normal{
    public abstract String move();
    public abstract String toString() ;
}

なぜコンパイル時エラーが出ないのですか?


コンパイル時にエラーが発生するのはなぜですか
Nitin T

コードを実行しているプラ​​ットフォームのログを共有していただけませんか?
アロク

1
興味深い質問です。近い投票がわかりません。しかし、Nitin、良い質問の書き方を学んでください。コードを投稿するだけでなく、実際の質問を見出しやコメントだけではなく、テキストに挿入してください。質問に何かを追加したい場合は、コメントではなく質問を編集します。今回はそれを行います。また、コードブロックの使用方法を学ぶことをお勧めします。コードのフォーマットも修正しました。
kriegaex

つまり、メソッドの推移的な宣言です。
Vishwa Ratna

回答:


10

Alokが引用されたことは事実であるが、彼は間違った(コードが無効であることを)彼の最終的な答えを作る何かを、見落とし:

インターフェイスにはString toString()、すべてのクラスがすでに実装しているメソッドが1つあり、それをから継承していObjectます。つまり、宣言されたインターフェースメソッドには、デフォルトメソッドと同様に、すでに実装があります。したがって、コンパイルエラーは発生せずNormal、私のMCVEに示されているように機能的なインターフェイスとして使用できます。

package de.scrum_master.stackoverflow;

@FunctionalInterface
interface Normal {
  String move();
  String toString();
}

ところで、インターフェースメソッドpublicは常にそうであるので、宣言する必要はありません。同じことが当てはまりますabstract

package de.scrum_master.stackoverflow;

public class NormalApp {
  static void doSomething(Normal normal) {
    System.out.println(normal.move());
    System.out.println(normal.toString());
  }

  public static void main(String[] args) {
    doSomething(() -> "xxx");
  }
}

ドライバアプリケーションを実行すると、次のコンソールログが表示されます。

xxx
de.scrum_master.stackoverflow.NormalApp$$Lambda$1/1530388690@28c97a5

ここで、メソッド名toStringを他の名前に変更toStringXすると@FunctionalInterface、クラスのコンパイル時に予期されるエラーメッセージが表示されることがわかります。

Unexpected @FunctionalInterface annotation
  de.scrum_master.stackoverflow.Normal is not a functional interface
    multiple non-overriding abstract methods found in interface de.scrum_master.stackoverflow.Normal

すばらしい答え、Kriegaex。
Alok

1
すばらしい説明、+ 1
Sandeep Tiwari

-1

まず最初にNitinは、これについて適切な調査を行う必要があります。次に、このプラットフォームにアクセスして、問題について質問する必要があります。

それにもかかわらず、まず第一に、Java 8の関数型インターフェースに関する疑問を解消させてください。

  1. Java 8の機能インターフェイスには、1つの抽象メソッドと任意の数のデフォルトメソッドしか含めることができません
  2. Java 8以降では、ラムダ式を使用して、機能インターフェースのインスタンスを表すことができます。
  3. @FunctionalInterfaceアノテーションは、機能インターフェースが複数の抽象メソッドを持つことができないようにするために使用されます。複数の抽象メソッドが存在する場合、コンパイラはUnexpected @FunctionalInterface annotationメッセージにフラグを立てます。ただし、このアノテーションの使用は必須ではありません。

あなたのコードのみによると、私は2つの抽象的なメソッドを見ることができたので、あなたのコードは無効です。

何らかの形でお役に立てば幸いです。詳細については、このリンクを参照してください:Java 8機能インターフェース


1
@FunctionalInterfaceは、上記のコードは私のコンパイル時のエラーを与えていない理由を私のインターフェイスは1つだけ抽象メソッドを持っている必要があることをコンパイラが保証場合alokあなたは私がちょうどそのための答えを必要とする私の質問を理解していませんでし
ニティンT

@NitinT、あなたが何を書いて有効か無効かを問題文で見てください。私はこれに基づいて答えを出しました。StackOverFlowで質問することについて調査してください。
アロク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.