2

Netbeans 8.0 のラムダ式に問題があり、何か間違ったことをしたのか、それとも Netbeans または javac コンパイラーが間違っているのか疑問に思っています。

次のコードがあります。

public interface HandView extends View<Hand> {
    void onCardAdded(final Card card);

    void onCardPlayed(final int cardIndex);

    void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo);

    public static HandView merge(final HandView... handViews) {
        return new HandView() {
            @Override
            public void onCardAdded(final Card card) {
                Arrays.stream(handViews).forEach(handView -> handView.onCardAdded(card));
            }

            @Override
            public void onCardPlayed(final int cardIndex) {
                Arrays.stream(handViews).forEach(handView -> handView.onCardPlayed(cardIndex));
            }

            @Override
            public void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo) {
                Arrays.stream(handViews).forEach(handView -> handView.onCardsSwapped(cardIndexOne, cardIndexTwo));
            }
        };
    }

    @FunctionalInterface
    public static interface OnCardAddedListener extends HandView, Consumer<Card> {
        @Override
        default void accept(final Card card) {
            onCardAdded(card);
        }

        @Override
        void onCardAdded(final Card card);

        @Override
        default void onCardPlayed(final int cardIndex) { }

        @Override
        default void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo) { }
    }

    @FunctionalInterface
    public static interface OnCardPlayedListener extends HandView, IntConsumer {
        @Override
        default void accept(final int cardIndex) {
            onCardPlayed(cardIndex);
        }

        @Override
        default void onCardAdded(final Card card) { }

        @Override
        void onCardPlayed(final int cardIndex);

        @Override
        default void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo) { }
    }

    @FunctionalInterface
    public static interface OnCardsSwappedListener extends HandView {
        @Override
        default void onCardAdded(final Card card) { }

        @Override
        default void onCardPlayed(final int cardIndex) { }

        @Override
        void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo);
    }
}

次に、次のように使用します。

AtomicInteger counter = new AtomicInteger(0);
HandView handView = card -> counter.incrementAndGet();

Netbeans は次のメッセージを表示します。

incompatible types: HandView is not a functional interface
    multiple non-abstract methods found in interface HandView

次に、手動でキャストすることにします。

HandView handView = 
    (HandView.OnCardAddedListener)card -> counter.incrementAndGet();

これで、キャストが冗長であることが警告されます。

元のバージョンで Netbeans 8.0 内でコンパイルすると、コンパイル(または実行時) エラーなしで正常にコンパイルされます。今は誰のせい?

これは のサブタイプであるSAMcard -> counter.incrementAndGet()実装しているので、正しいはずですよね? HandView.OnCardAddedListenerHandView

4

2 に答える 2

1

Netbeans から得られるエラー メッセージは正しいと思います。

public interface HandView extends View<Hand> {
    void onCardAdded(final Card card);

    void onCardPlayed(final int cardIndex);

    void onCardsSwapped(final int cardIndexOne, final int cardIndexTwo);

    (...)
}

これは実際にはFunctionalInterfaceではありません。

この行について:

HandView handView = 
    (HandView.OnCardAddedListener)card -> counter.incrementAndGet();

これを次のように書きます。

HandView.OnCardAddedListener handView = card -> counter.incrementAndGet();

警告なしで、コンパイラがより適切に処理することを期待しています。

于 2014-05-02T14:20:11.907 に答える