泛型 - 如何传递一个对象数组

时间:2018-04-07 23:48:21

标签: java generics computer-science

我们目前正在课堂上学习泛型,但我仍然感到困惑。我目前正在做一项任务,我老师要我做的是使用二进制搜索算法搜索具有一定半径的圆。我相信我已经设置了所有内容,但我对如何将一组对象传递给泛型方法感到困惑。如果我不知道如何使用泛型访问一组对象。我希望我正确地问这个问题

这就是我当然没有做到的。

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

谢谢, 鱼

2 个答案:

答案 0 :(得分:1)

泛型是一种在保持类型安全的同时将代码推广到各种类型的方法。将某人介绍给泛型的常用方法是将非泛型List接口与通用List<T>接口进行比较。原始List可以包含任何对象类型,因此不是类型安全的。原始列表可以同时包含您最喜欢的CoinStamp集合,当您检索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

}