【发布时间】:2014-11-12 09:18:05
【问题描述】:
public static <T extends Comparable<T>> T search(T[] a,T first,T last,T key)
{
T result;
if(first.compareTo(last)>0)
result = -1;
else{
int mid = (Integer)(first+last)/2;
if(key==a[mid])
result = mid;
else if(key<a[mid])
result = search(a,first,mid - 1,key);
else if(key>a[mid])
result = search(a,mid+1,last,key);
}
return result;
}
这是我正在尝试编写的递归二进制搜索。我正在尝试使用泛型,但我很天真。我遇到的所有错误都是类型转换错误。除非它说的是(mid-1)。错误是“推理变量 T 具有不兼容的界限”。我想学习如何解决它们。 谢谢。
【问题讨论】:
-
一个可比较的不能转换为整数。以字符串为例
-
不按铃兄弟..
-
你的 last 和 first 是数组中的索引,所以将它们定义为整数,这样可以修复你的方法
-
@Yourfavouritenoob 如果您刚开始使用泛型,一个很好的解决方法是将方法编写为非泛型方法,然后逐渐查看可以在哪里重用它并使这些部分通用。每次调用该方法时,类型参数
T将代表一个类型(即,它不像示例代码显示的那样神奇)。值得考虑可以使用的不同类型并将T替换为该类型......“所以 T 是 Comparable- 是否有效......” -
顺便说一句:也许是关于如何编写泛型的一个很好的提示:首先使用具体类型编写所有内容,例如
String而不是T。一旦成功,将每一个具体类型的提及变成一些T。这也是编译器试图确保反向工作的原因:就像考虑具体类型而不是 T。该检查失败,因为mid - 1是Integer但不一定是它所考虑的具体类型。你会注意到,如果你先用一些具体类型编写方法,这就是为什么当我对泛型感到困惑时我喜欢这样做。
标签: java class oop object generics