java - Java 中的泛型,通用函数

标签 java generics

我有两个类,它们都包含 ObservableList 但填充了不同的对象。在其他逻辑类中,我有返回列表中适当对象的函数:

public CarTableView findCarTableView( Button button) {
    for(CarTableView carnet : carTableViewModel.getObservableList()) {
        if(carnet.getActionButton().equals(button)) {
            return carnet;
        }
    }

    return null;
}

第一类:

public class CustomerTableView extends Customer{

    private ObservableList<CustomerTableView> list = FXCollections.observableArrayList(); //HERE
    private Button actionButton;

    public CustomerTableView(String name, String surname, String city, 
                             String postCode, String street,
                             String localNumber, Button actionButton) {
        super(name, surname, city, postCode, street, localNumber);
        this.actionButton=actionButton;
    }
}

第二类:

public class CarTableView  extends Car{

    private ObservableList<CarTableView> list = FXCollections.observableArrayList(); //HERE
    private  Button actionButton;

    public CarTableView(String brand, String engine, String yearOfProduction, 
                        boolean navi, boolean available, int power, 
                        Button actionButton) {
        super(brand, engine, yearOfProduction, navi, available, power);
        this.actionButton=actionButton;
    }
}

但此功能仅适用于特定类的一个对象。我发现了泛型功能,但遇到了一个问题。在这个函数中,我必须使用特定的方法,这两个类都有 (getActionButton() ,getObservableList())

我遇到过这样的代码,但是编译器告诉我缺少这些功能,我怎样才能做得更好?

public <T> T findCarTableView(T t, Button button) {
    for(T carnet : t.getObservableList()) {
        if(carnet.getActionButton().equals(button)) {
            return carnet;
        }
    }

    return null;
}

最佳答案

您的问题是编译器不知道 T 的任何边界,因此必须假设 Object。因此 t.getObservableList() 无法工作,因为该方法不存在于 Object 中。

为了使这项工作提供一个公共(public)接口(interface)或父类(super class),并将其用作 T 的边界:

interface CommonInterface<T extends CommonInterface<T>> {
  Collection<T> getObservableList();
}

public <T extends CommonInterface<T>> T findCarTableView(T t, Button button) {
  for(T carnet : t.getObservableList()) {
   ...
  }
}

请注意,这假设类型为 T 的对象包含其他相同类型的可观察对象。如果不是这种情况,请将您的界面和方法更改为如下所示:

interface CommonInterface<T> {
  Collection<T> getObservableList();
}

public <T> T findCarTableView(CommonInterface<T> t, Button button) {
  for(T carnet : t.getObservableList()) {
   ...
  }
}

关于java - Java 中的泛型,通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45440300/

相关文章:

java - 我们从哪里得到 "import"的东西?

java - jpa子查询中不必要的连接

java - 如何重命名文件Java.nio?

java - 在 web.xml 中定义和初始化变量然后从 Java 代码访问它们的最佳实践

c# - 如何使用反射将未知属性正确地转换为从公共(public)基础派生的通用列表?

java - FileStats 类出现问题

java - 接受两种不同类型作为参数的方法

java - 我使用泛型,但不是 This Class<T> 东西!

generics - 类型推断: Using generic methods with implicit type conversion

Scala:通用加权平均函数