我们目前正在课堂上学习泛型,但我仍然感到困惑。我目前正在做一项任务,我老师要我做的是使用二进制搜索算法搜索具有一定半径的圆。我相信我已经设置了所有内容,但我对如何将一组对象传递给泛型方法感到困惑。如果我不知道如何使用泛型访问一组对象。我希望我正确地问这个问题
这就是我当然没有做到的。
public class Question1
{
public static void main(String[] args)
{
Circle[] b = {new Circle(1),new Circle(2),new Circle(3),new Circle(4),new Circle(5)};
System.out.println(b[0].getR());
run(b,3,0, b.length-1);
}
/**
*
* @param <T>
* @param b
* @param key
* @param low
* @param high
*/
public static <T> Object run(T[] b , T key, int low, int high)
{
int mid = ((low + high)/2);
if(high < low)
{
System.out.print(-1);
}
if(key == b[mid])
{
System.out.println(b[mid]);
}
if(key < b[mid])
{
return run(b,key,low,mid-1);
}
else
{
return run(b,key,mid+1,high);
}
}
}
谢谢, 鱼
答案 0 :(得分:1)
泛型是一种在保持类型安全的同时将代码推广到各种类型的方法。将某人介绍给泛型的常用方法是将非泛型List
接口与通用List<T>
接口进行比较。原始List
可以包含任何对象类型,因此不是类型安全的。原始列表可以同时包含您最喜欢的Coin
和Stamp
集合,当您检索Coin
但获得Stamp
实例时,这可能会导致严重错误代替。
List<Coin>
只能包含Coin
个实例。编译器不允许将Stamp
插入列表中。只要程序编译没有错误或警告,编译器就会保证每次从列表中获取Coin
时,您只能获得Coin
个。
我的老师要我做的就是使用二进制搜索算法来 搜索具有一定半径的圆。
此作业不需要通用方法,所以我不确定为什么要求你写一个,除非有关于你没有透露的作业的细节。
您当前的解决方案包含一个明显的问题:您无法使用==
运算符来测试对象之间的值相等性。在对象比较中,==
运算符仅测试身份。这将打印错误:
System.out.println("my test" == new String("my test"));
上面有两个具有不同身份的对象:字符串文字和新创建的String实例。它们都具有不同的身份(即使它们具有相同的值),因此表达式的计算结果为false。对于对象之间的值比较,您需要编写equals()
和hashCode()
方法。评估结果为true:"my test".equals(new String("my test"));
另请注意,它们与对象的表达式(键&lt; b [mid])是非法的,因为<
运算符对于对象类型无效。
答案 1 :(得分:0)
如果我理解正确,第二个参数的类型必须是Circle
而不是当前的整数3.
public static void main(String[] args)
{
Circle[] b = {new Circle(1),new Circle(2),new Circle(3),new Circle(4),new Circle(5)};
System.out.println(b[0].getR());
run(b, new Circle(3), 0, b.length-1); // <-- change this line
}