0

我有:

public abstract class V {}

public class PV extends V {}

public class TV extends V {}

我也有:

ListView<? extends V> listView = new ListView<>();

当我尝试:

listView.setCellFactory(new Callback<ListView<? extends V>, ListCell<? extends V>>() {
        @Override
        .............
    });

我收到错误警告:

Incompatible types: 
anonymous Callback<ListView<? extends V>, ListCell<? extends V>>
cannot be converted to Callback<ListView<CAP#1>, ListCell<CAP#!>>
where CAP#1 is fresh type-variable:
CAP#1 extends V from capture of ? extends V

我试过了:

new Callback<ListView<V>, ListCell<V>>() 

那并没有解决这个问题。

为什么我会收到该消息,有什么办法可以解决它?

4

1 回答 1

1

cellFactory需要一个Callback<ListView<T>, ListCell<T>>where是的T类型参数ListView

使用通配符不能指定确切的类型参数。此外,由于您的通配符限制TV您不能使用的超类型ListCell<? extends V>(即使不要求确切类型,updateItem接收与 的类型参数匹配的值ListCell,也不能保证该类型是可分配的(ListView可能Object并且其中之一ListView可能是PV))。

您可以创建一种方法来创建Callback虽然以防止通配符成为问题,但是super限制仍然没有什么意义,因为ListCell充当消费者。

public static <T> Callback<ListView<T>, ListCell<T>> forListView() {
    return new Callback<ListView<T>, ListCell<T>>() {
        @Override
        public ListCell<T> call(ListView<T> lv) {
            return new ListCell<T>() {

                @Override
                protected void updateItem(T item, boolean empty) {
                    super.updateItem(item, empty);
                    setText((empty || item == null) ? "" : item.toString());
                }

            };
        }
    };
}
ListView<? super V> lv = ...;
lv.setCellFactory(forListView());

T(您也可以对静态方法施加限制public static <T super V> Callback<ListView<T>, ListCell<T>> forListView():)

于 2018-05-14T13:55:30.490 回答