2016-06-21 45 views
1

我想做一個通用的方法來比較多種類型的對象。java調用一個通用的靜態方法

這是我簡單的接口

interface comparable<T> { 
    boolean isBiggerThan(T t1); 
} 

,這是它一個實現:

class StringComparable implements comparable<String> { 

    public StringComparable(String s) { 
     this.s = s; 
    } 

    String s; 

    @Override 
    public boolean isBiggerThan(String t1) { 
     return s.equals(t1); 
    } 

} 

這是我的類,它有一個通用的方法:

class Utilt { 
    public static <T extends comparable<T>> int biggerThan(T values[], T t) { 
     int count = 0; 
     for (T oneValue : values) { 
      if (oneValue.isBiggerThan(t)) { 
       count++; 
      } 
     } 
     return count; 
    } 
} 

我打電話像這樣的方法:

public class TestTest { 
    public static void main(String args[]) { 
     StringComparable a = new StringComparable("Totti"); 
     StringComparable pi = new StringComparable("Pirlo"); 
     int i = Utilt.biggerThan(new StringComparable[] { a, pi }, a); 
    } 
} 

但我得到這個錯誤:biggerThan必須實現comparable<T>您的靜態方法

The method `biggerThan(T[], T)` in the type `Utilt` is not applicable for the arguments `(StringComparable[], StringComparable)` 
+0

引用此:http://stackoverflow.com/questions/17739720/inferred-type-is-not-a-valid-substitute-for-a-comparable-generic-type – Boola

回答

1

泛型參數TStringComparable implements comparable<String>,而不是comparable<StringComparable>,所以它不符合你的靜態方法的泛型參數。

您可以通過更改StringComparable來實現comparable<StringComparable>來解決此問題。

class StringComparable implements comparable<StringComparable> { 

    public StringComparable(String s) { 
     this.s = s; 
    } 

    String s; 

    @Override 
    public boolean isBiggerThan(StringComparable t1) { 
     return s.equals(t1.s); 
    } 

} 

做出這樣的轉變後,您main會通過編輯和打印1

這就是說,我不確定它有多少意義,它使一種方法,測試的平等被稱爲isBiggerThan

+0

但這不是我想要的這樣做,我想與字符串不可比較的接口與stringComparable –

0

您的比較器接口期望String值而不是String數組。雖然在調用該方法時,您傳遞的是StringComparable數組,因此它顯示錯誤

0

請注意!comparable<String> instanceof comparable<StringComparable>。 因此,嘗試這樣的事:

class StringComparable implements comparable<StringComparable> { 

    public StringComparable(String s) { 
    this.s = s; 
    } 

    String s; 

    public String getS(){ 
    return s; 
    } 

    @Override 
    public boolean isBiggerThan(StringComparable t1) { 
    return s.equals(t1.getS()); 
    } 

} 

而且Utilt類

class Utilt { 
    public static <T extends comparable<T>> int biggerThan(T values[], T t) { 
     int count = 0; 
     for (T oneValue : values) { 
      if (oneValue.isBiggerThan(t)) { 
       count++; 
      } 
     } 
     return count; 
    } 
} 

而且是更好地覆蓋equalshashCode,所以你可以在isBiggerThan方法調用this.equals(t1)

BTW,方法isBiggerThan看起來很可疑,只要:

StringComparable s1 = new StringComparable("string1"); 
StringComparable s2 = new StringComparable("string2"); 
s1.isBiggerThan(s2); // output => true 
s2.isBiggerThan(s1); // output => true 

這是給你的,但對我來說這個邏輯看起來是錯誤的。