2016-06-21 2 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); 
    } 
} 

Но я получаю эту ошибку:

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

универсальный параметр T вашего статического метода biggerThan должен реализовать comparable<T>. StringComparable реализует 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

, но это не то, что я хочу do, я хочу, чтобы сопоставимый интерфейс со строкой не с 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; 
    } 
} 

Также лучше переопределить equals и hashCode, так что вы можете вызвать this.equals(t1) в isBiggerThan методом.

Кстати, метод isBiggerThan выглядит очень подозрительно, пока:

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

Это до вас, но для меня эта логика выглядит неправильно.

Смежные вопросы