2017-08-01 18 views
1

私は2つのクラスを持っていますが、どちらも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; 
    } 
} 

しかし、この機能だけのために働く他のロジッククラスでは、私は私のリストの適切なオブジェクトを返す関数を持っています特定のクラスからの1つのオブジェクト。 Genericsのfunctonalityを見つけましたが、私は1つの問題に遭遇しました。この関数では、これらのクラスの両方で特定のメソッドを使用する必要があります(getActionButton(),)

私はそのようなコードに出くわしましたが、コンパイラはこれらの関数が不足していると私に通知します。

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

    return null; 
} 
+0

それでも「コンパイラは、これらの機能の欠如について私に知らせる」私の問題 – Michael213

+1

を解決いけない - あなたは何を意味するのですか?コンパイルエラーが出ますか?正確なエラーメッセージは何ですか? – Jesper

+0

getObservableList()メソッドは、タイプT – Michael213

答えて

3

問題は、コンパイラはTの境界を知らないため、Objectとする必要があります。従ってt.getObservableList()は、その方法がObjectに存在しないため動作できません。

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のオブジェクトが同じタイプの他の観測が含まれていることを前提としていること:この作品は、共通のインタフェースまたはスーパークラスを提供し、Tのための境界としてことを使用するようにするに

。それはそうでないなら、あなたのインターフェースおよび方法は、このようなものに変更します。@Updated

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には異なる型も含まれています。 – Michael

+0

ObservableListを使用