-1

我以前的 SSCCE 本身是不正确的。我试着再写一篇,但它也不正确。所以,现在我不明白这个问题,因此无法编写纯 Java 示例,因此我发布了带有库类的示例:

import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.util.Callback;

public class DoubleQuestionMark3 {

   public static class MyClass {
   }

   public static void main(String[] args) {

      TableColumn<MyClass, ?> column = new TableColumn();

      Callback<TableColumn<MyClass, ?>, TableCell<MyClass, ?>> callback = new Callback<TableColumn<MyClass, ?>, TableCell<MyClass, ?>>() {
         @Override
         public TableCell<MyClass, ?> call(TableColumn<MyClass, ?> param) {
            return null;
         }
      };

      column.setCellFactory(callback);

   }
}

问题是一样的:如何准备callback合适的班级?

如果不可能,那么,首先,请说明它真的不可能,其次,请解释为什么它是不可能的。

更新

指定Object回调没有帮助:

 Callback<TableColumn<MyClass, Object>, TableCell<MyClass, Object>> callback = new Callback<TableColumn<MyClass, Object>, TableCell<MyClass, Object>>() {
         @Override
         public TableCell<MyClass, Object> call(TableColumn<MyClass, Object> param) {
            return null;
         }
      };
4

1 回答 1

1

当您使用 type 声明变量时TableColumn<MyClass, ?>?表示未知类型,因此无法定义适当类型的Callback变量,因为它引用了未知类型。

如果您有可以处理任意类型的通用代码,则必须在具有类型变量的类或方法中编写该代码,为未知类型命名,例如,您可以使用方法引用:

public class DoubleQuestionMark3 {

    public static void main(String[] args) {
        TableColumn<MyClass, ?> column = new TableColumn();
        column.setCellFactory(DoubleQuestionMark3::call);
    }
    static <T> TableCell<MyClass, T> call(TableColumn<MyClass, T> param) {
        // fill with life...
        return new TableCell<>();
    }
}

这可以作为代码使用,可以使用任意类型T,即使调用者不知道类型,就像使用TableColumn<MyClass, ?>.


或者,您可以将整个初始化代码移动到一个泛型方法中:

public class DoubleQuestionMark3 {

    public static void main(String[] args) {
        TableColumn<MyClass, ?> column = new TableColumn();
        initialize(column);
    }
    static <T> void initialize(TableColumn<MyClass, T> column) {
        Callback<TableColumn<MyClass, T>, TableCell<MyClass, T>> cellFactory
        = new Callback<TableColumn<MyClass, T>, TableCell<MyClass, T>>() {
            @Override
            public TableCell<MyClass, T> call(TableColumn<MyClass, T> param) {
                // fill with life
                return new TableCell<>();
            }
        };
        column.setCellFactory(cellFactory);
    }
}

简单地说,每当您有一个出现在多个位置的未知类型并且您必须确保这些未知类型的出现引用相同的类型时,您需要一个命名类型变量。

于 2016-06-06T14:44:21.483 回答