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 内でコンパイルすると、コンパイル(または実行時) エラーなしで正常にコンパイルされます。今は誰のせい?
これは のサブタイプであるSAMをcard -> counter.incrementAndGet()
実装しているので、正しいはずですよね? HandView.OnCardAddedListener
HandView