web-dev-qa-db-ja.com

ラムダを使用して新しいListChangeListener <Item>()を作成するにはどうすればよいですか?

Java8でラムダを使用して新しいListChangeListener()を作成するにはどうすればよいですか?

listItems.addListener(new ListChangeListener<Item>() {
    @Override
    public void onChanged(
        javafx.collections.ListChangeListener.Change<? extends Item> c) {
        // TODO Auto-generated method stub
    }
});

これは私が試したものです:

listItems.addListener(c->{});

しかし、Eclipseは次のように述べています。

メソッドaddListener(ListChangeListener)は、タイプObservableListに対してあいまいです。

リストは次のように宣言されています。

ObservableList<Item> listItems = FXCollections.observableArrayList();
14
simonides

ObservableListObservableインターフェースからaddListener(InvalidationListener)を継承するため、コンパイラーは呼び出すバージョンを判別できません。キャストを介してラムダのタイプを指定すると、これが修正されるはずです。

listItems.addListener((ListChangeListener)(c -> {/* ... */}));

cのタイプを明示的に指定することもできます。

listItems.addListener((ListChangeListener.Change<? extends Item> c) -> {/* ... */});
32
Andrew Vitkus

このコードは、タイプを指定しなくても機能します。

listView.focusedProperty ().addListener ( (arg, oldVal, newVal) -> System.out
        .printf ("ListView %s focus%n", (newVal ? "in" : "out of")));
2
dmolony