2016-06-21 18 views
1

多くの種類のオブジェクトを比較する汎用メソッドを作成しようとしています。java汎用の静的メソッドを呼び出す

これは私のシンプルなインタフェース

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

であり、これはそれのための1つの実装である:私は呼ん

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

:これは一般的な方法を持っている私のクラスは

class StringComparable implements comparable<String> { 

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

    String s; 

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

} 

ですそのような方法:

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); 
    } 
} 

しかし、私はこのエラーを取得する:

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

comparable<T>を実装する必要がありbiggerThanあなたの静的メソッドのジェネリックパラメータTStringComparableはであり、comparable<StringComparable>ではないため、静的メソッドの汎用パラメータと一致しません。

あなたはcomparable<StringComparable>を実装するために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

しかし、それは私がしたいものではありませんdo、私はstringComparableではなく、stringとの比較可能なインターフェイスをしたい –

0

コンパレータインターフェイスでは、文字列配列ではなく文字列値が必要です。そのメソッドを呼び出すときにしながら、あなたはそのが!comparable<String> instanceof comparable<StringComparable>というエラー

0

ご注意を示すようStringComparable配列を渡しています。あなたはisBiggerThan方法でthis.equals(t1)を呼び出すことができますので、

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を上書きした方がよい: だから、このような何かを試してみてください。それはあなた次第ですが、私のために、このロジックが間違って見える

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

ところで、この方法isBiggerThanは限り非常に疑わしいです。

関連する問題