2017-08-01 71 views
1

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

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; 
} 
+0

@Updated但仍然没有解决我的问题 – Michael213

+1

“编译器告诉我关于缺少这些功能” - 你什么意思?你有编译错误吗?什么是确切的错误信息? – Jesper

+0

方法getObservableList()未定义类型T – Michael213

回答

3

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

为了使这项工作提供了一个通用的接口或超类,并把它作为一个边界为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()) { 
    ... 
    } 
} 
+0

这就是我一直在寻找!谢谢,我接受了答案 – Michael213

2

创建一个具有getActionButton()和getObservableList()方法的接口。 CarTableView和CustomerTableView必须实现它。

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

其中TableView是您的接口。

+0

我想过这个,但是'ObservableList's也包含不同的类型。 – Michael

+0

并使用ObservableList