【问题标题】:Java how to write genericsJava如何编写泛型
【发布时间】: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 - 1Integer 但不一定是它所考虑的具体类型。你会注意到,如果你先用一些具体类型编写方法,这就是为什么当我对泛型感到困惑时我喜欢这样做。

标签: java class oop object generics


【解决方案1】:

您似乎误解了Comparable 接口;仅仅因为某些东西具有可比性并不意味着转换为Integer 会成功。或者您可以使用+ 运算符。如果您确定可以将值相加,您可能需要查看提供intValue() 函数的Number 接口。

【讨论】:

    【解决方案2】:

    如果我理解你做对了,这就是你想要得到的:

    public static <T extends Comparable<T>> T search(T[] sortedArray,int first,int last,T key)
    {
        T result;
        if(first > last)
            result = null;
        else{
            int mid = (Integer)(first+last)/2;
            if(key.equals(sortedArray[mid]))
                result = sortedArray[mid];
            else if(key.compareTo(sortedArray[mid]) <0)
                result = search(sortedArray,first,mid - 1,key);
            else
                result = search(sortedArray,mid+1,last,key);
        }
        return result;
    }
    

    当 'first' == 'last' 时似乎存在问题,因为递归不会在那里停止。 您应该为此添加一个检查:

        if(first == last)
        {
            if(sortedArray[first].equals(key))
            {
                return sortedArray[first]; 
            }
            else
            {
                return null;
            }
        }
    

    您真的想取回刚刚作为密钥输入算法的对象吗?

    如果您想获取数组中键的索引,则必须将返回值更改为 int 和:

    • 返回 -1 而不是 null 以表示错误
    • 如果您找到该对象,则返回中间或第一个。

    【讨论】:

    • Thanx。如何返回索引而不是值?不会出现同样的类型转换问题吗?
    • 最后一条评论挽救了一天,我正处于学习泛型的第一阶段。只是在不知道我在做什么的情况下跟随了一个教程。我回顾了我的代码,我真的不需要返回一个对象。我需要的只是键和 T 类型的数组。其余的都是整数。谢谢你最后的评论。
    猜你喜欢
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多