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)`
# 1 楼答案
请注意
!comparable<String> instanceof comparable<StringComparable>
。 因此,请尝试以下方法:和UTIT类
另外最好重写
equals
和hashCode
,这样您就可以在isBiggerThan
方法中调用this.equals(t1)
顺便说一句,方法
isBiggerThan
看起来非常可疑,只要:这取决于你,但对我来说,这个逻辑看起来是错误的
# 2 楼答案
静态方法
biggerThan
的泛型参数T
必须实现comparable<T>
StringComparable
实现了comparable<String>
,而不是comparable<StringComparable>
,因此它与静态方法的泛型参数不匹配您可以通过将
StringComparable
更改为实现comparable<StringComparable>
来解决此问题在进行更改之后,您的
main
将通过编译并打印1
也就是说,我不确定调用
isBiggerThan
测试相等性的方法有多大意义# 3 楼答案
比较器接口需要的是字符串值,而不是字符串数组。当调用该方法时,您传递的是StringComparable数组,因此它会显示错误