【问题标题】:Stuck on Comparator<T>卡在比较器<T>
【发布时间】:2013-05-25 09:08:44
【问题描述】:

这是我的第一篇文章。这适用于 Java 7。

谁能告诉我为什么我无法访问 CompareIpaddress 类中的“first.a”? (我不知道为什么 SOF 不允许我发布这个,除非我输入更多内容......)这足够填充吗?

谢谢, 戈登

  import java.util.Comparator; 
  import java.util.*; // just in case i need it.
  import java.util.TreeSet;

  public class CompareIpaddress <IPaddress >implements Comparator<IPaddress>
  {
     /************************************************compare()**/
     public int compare (IPaddress first, IPaddress second)
     {
       if( first.a < second.a )
       {   
          return -1;
       }
     }
  }

  import java.util.Comparator;
  import java.util.*;
  import java.util.TreeSet;

  public class IPaddress
  {
     public int a, b, c, d;

     IPaddress (int a, int b, int c, int d)
     {
        this.a=a;
        this.b=b;
        this.c=c;
        this.d=d;
     }

     public int getA()
     {
        return a;
     }
  }

【问题讨论】:

    标签: java


    【解决方案1】:
    public class CompareIpaddress <IPaddress >implements Comparator<IPaddress>
    

    您将IPaddress 设置为CompareIpaddress 的类型参数,所以这是任何类型,而不是同名的类。

    由于不是每个类都有可访问的成员a,因此编译器无法找到该符号。

    public class CompareIpaddress implements Comparator<IPaddress>
    

    是正确的方法。

    (对于其他情况,您还需要返回一个值,但我想您已经为这个问题减少了这个值。)

    【讨论】:

    • 换句话说。通过编写 public class CompareIpaddress,他将特定类中 IPaddress 的含义重新定义为通用参数。
    • 我把它改成了这个,它修复了first.a,但是它影响了TreeSet ts = TreeSet(Comparator super IPaddress> compare);
    • 这是我的完整代码:(我真的很难用这个编辑器!!!它不会让我点击返回插入代码。)
    • 你可以问一个新的问题,@Gordon415。我认为,添加新代码会改变太多,而且我并不过于乐观地认为您的问题可以在没有看到代码的情况下被诊断出来。
    【解决方案2】:

    删除public class CompareIpaddress &lt;IPaddress&gt; implements Comparator&lt;IPaddress&gt;中的类型参数IPaddress。通过这种方式,您将使用类型参数隐藏类名称 IPaddress

    实际上,这里根本不需要类型参数。 改成public class CompareIpaddress implements Comparator&lt;IPaddress&gt;就一切正常了。

    【讨论】:

    • Sebastian,你怎么知道我什么时候需要使用 type 参数..(我很难在这个窗口中编辑我的回复..)你怎么知道我什么时候需要 public class CompareIpaddress implements Comparator verses public class CompareIpaddress implements Comparator 我想我不需要类型参数,因为我只会使用一种类型的泛型,那就是它总是是 IP 地址对象吗?
    【解决方案3】:
     public int compare (IPaddress first, IPaddress second)
     {
       if( first.a < second.a )
       {   
          return -1;
       }
     }
    

    此代码无法编译,因为当您声明返回类型 int 的方法时,它必须始终返回类型 int。目前,它仅在first.a 小于second.a 时返回一个值。您应该在其他一些情况下添加,以涵盖所有可能性:

    if(first.a < second.a) 
    {
        return -1;
    }
    else if(first.a > second.a)
    {
        return 1;
    }
    else
    {
        return 0;
    }
    

    【讨论】:

    • 同意。我没有删除,因为它很好地补充了其他答案。
    【解决方案4】:

    你应该使用

    public class CompareIpaddress implements Comparator<IPaddress>
    

    因为你真的不需要类型参数

    如果您使用 IDE,您可能会收到一些警告。

    【讨论】:

      【解决方案5】:

      你应该可以的。我认为您的错误是您没有备用返回语句。尝试使用比较方法中的 if 而不是只使用代码:

       public int compare (IPaddress first, IPaddress second)
       {
         return first.a - second.a; //Returns 0 if equal.
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多