2017-05-26 79 views
1

這是最小的代碼示例。接口:在通用類中實例化Java通用類

interface Individual<T> { 
    public T getVariableValue(int index) ; 
    public void setVariableValue(int index, T value) ; 

    public int getNumberOfVariables() ; 
    public int getNumberOfObjectives() ; 

    public Individual<T> copy() ; 
} 

和類:

public class minimalExample<S extends Individual> { 

    private List<S> doCrossover(List<S> s){ 
     S mom = s.get(0); 
     S dad = s.get(1); 

     int crossoverPoint = 5; 

     S girl = mom.copy(); 
     S boy = dad.copy(); 
     for (int i = 0; i < mom.getNumberOfVariables(); i++) { 
      if(i > crossoverPoint){ 
       boy.setVariableValue(i, mom.getVariableValue(i)); 
       girl.setVariableValue(i,dad.getVariableValue(i)); 
      } 
     } 
     return s; 
    } 
} 

如果我嘗試編譯此我得到:

java: incompatible types: Individual cannot be converted to S 

這似乎令人困惑。不是'extends關鍵字是否意味着S必須是個人類型或子類型?

+0

你的複製方法有一個返回類型牛逼不S.我不知道你不必將它轉換至S –

回答

1

這似乎令人困惑。不是'extends關鍵字是否意味着S必須是個人類型或子類型?

是的,但是這並不意味着由Scopy()方法返回的類型也是SIndividual接口只需要它是一個Individual

此外,我觀察到您的類minimalExample正在使用原始類型Individual,而它應該使用正確的參數化版本(否則Individual應該使非通用)。

您可能會在此處進行過度參數化。 minimalExample確實需要使用S而不是直接使用Individual?很明顯,這個例子類沒有,但也許啓發這個問題的那個也沒有。

在另一方面,如果你需要一個參數的具體類型Individual,那麼也許你需要進一步參數該接口描述對象的類型及其copy()方法返回:

interface Individual<T,I extends Individual<T, I>> { 
    public T getVariableValue(int index) ; 
    public void setVariableValue(int index, T value) ; 

    public int getNumberOfVariables() ; 
    public int getNumberOfObjectives() ; 

    public I copy() ; 
} 

然後,您可以用所需的額外信息申報的MinimalExample類:

public class MinimalExample<T, S extends Individual<T, S>> { 
    // ... 
} 

這裏是一個虛擬實現的Individual,你可以與使用:

public class ExampleIndividual<T> implements Individual<T, ExampleIndividual<T>> { 

    public T getVariableValue(int index) { return null; } 
    public void setVariableValue(int index, T value) {} 

    public int getNumberOfVariables() { return 0; } 
    public int getNumberOfObjectives() { return 0; } 

    public ExampleIndividual<T> copy() { return new ExampleIndividual<T>(); } 

} 
+0

你是對的。我過度參數化。示例中的最終解決方案是僅使用通用的,然後使用其他所有地方的個人。 – FlapKap

1

copy()方法返回一個類型爲「Individual」的對象,由於S是一個子類型,所以它不能被分配給類型「S」。

爲什麼女孩和男孩被宣佈爲「S」型而非「個人」?