Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现可比较、可比较到名称冲突:“;具有相同的擦除,但两者都不覆盖另一个“;_Java_Generics_Overriding_Comparable_Erasure - Fatal编程技术网

Java 实现可比较、可比较到名称冲突:“;具有相同的擦除,但两者都不覆盖另一个“;

Java 实现可比较、可比较到名称冲突:“;具有相同的擦除,但两者都不覆盖另一个“;,java,generics,overriding,comparable,erasure,Java,Generics,Overriding,Comparable,Erasure,我希望有一个接受实数的compareTo方法(一个处理任意大而精确的实数的类[好吧,只要目前长度小于2^31])和一个接受对象的compareTo方法,但Java不允许,我也没有足够的经验知道原因 我只是试图修改这个类来实现Comparable,我在下面得到了这些错误消息。我真的不明白错误消息的意思,但我知道这与我试图为类提供一些灵活性的可怕方式有关,我为每个方法提供了所有不同的方法签名,我可以通过删除compareTo(Object other)方法来修复它,但理想情况下我希望保留它。所以我真

我希望有一个接受实数的compareTo方法(一个处理任意大而精确的实数的类[好吧,只要目前长度小于2^31])和一个接受对象的compareTo方法,但Java不允许,我也没有足够的经验知道原因

我只是试图修改这个类来实现Comparable,我在下面得到了这些错误消息。我真的不明白错误消息的意思,但我知道这与我试图为类提供一些灵活性的可怕方式有关,我为每个方法提供了所有不同的方法签名,我可以通过删除compareTo(Object other)方法来修复它,但理想情况下我希望保留它。所以我真正想问的是:有没有一种方法可以在不删除compareTo(Object other)方法的情况下使这些错误消息消失?这些错误到底意味着什么

另外,我知道已经有一些内置的Java类,比如BigInteger和类似的东西,我正试图使用这个类,但我这样做是为了好玩/满足于与Project Euler()一起使用

以下是比较方法:

  @Override
  public int compareTo(Real other)
  {
    // Logic.
  }
  public int compareTo(char givenValue) 
  { return compareTo(new Real(givenValue)); }
  public int compareTo(char[] givenValue) 
  { return compareTo(new Real(givenValue)); }
  public int compareTo(char[] givenValue, int offset, int count) 
  { return compareTo(new Real(givenValue, offset, count)); }
  public int compareTo(double givenValue) 
  { return compareTo(new Real(givenValue)); }
  public int compareTo(float givenValue) 
  { return compareTo(new Real(givenValue)); }
  public int compareTo(int givenValue) 
  { return compareTo(new Real(givenValue)); }
  public int compareTo(long givenValue) 
  { return compareTo(new Real(givenValue)); }
  public int compareTo(Object other) 
  { return compareTo(new Real(other.toString())); }
以及构造器,以防您需要它们:

  public Real(String givenValue)
  {
    // Logic.
  }
  public Real(char givenValue) 
  { this(String.valueOf(givenValue)); }
  public Real(char[] givenValue) 
  { this(String.valueOf(givenValue)); }
  public Real(char[] givenValue, int offset, int count) 
  { this(String.valueOf(givenValue, offset, count)); }
  public Real(double givenValue) 
  { this(String.valueOf(givenValue)); }
  public Real(float givenValue) 
  { this(String.valueOf(givenValue)); }
  public Real(int givenValue) 
  { this(String.valueOf(givenValue)); }
  public Real(long givenValue) 
  { this(String.valueOf(givenValue)); }
  public Real(Object other) 
  { this(other.toString()); }

违规的方法有:

@Override
public int compareTo(Real other) { ... }

public int compareTo(Object other) { ... }
这些方法具有相同的特性,这意味着一旦编译器去掉泛型类型信息,就不再有办法在运行时区分它们

您可以选择删除
compareTo(Object other)
重载,或者让
Real
实现
Comparable

因为它看起来像是所有
compareTo
重载的实现只是实例化一个新的
Real
并将其传递给
compareTo(Real)
,我建议删除它们并将转换留给调用方:

Real real = ...;
Object compared = ...;

Real comparedAsReal = new Real(compared);
int result = real.compareTo(comparedAsReal);

这是Java泛型类型擦除的副作用

您正在实现一个通用接口,可比较,但这是其唯一的方法,一旦删除通用类型,它将成为compareTo(对象),因此它与您自己的compareTo(对象)冲突

下面是要复制的最小代码:

class Real implements Comparable<Real>
{
    public int compareTo(Object o)
    {
        return 0;
    }

    @Override
    public int compareTo(Real o)
    {
        return 0;
    }       
}
class实数实现可比性
{
公共整数比较对象(对象o)
{
返回0;
}
@凌驾
公共整数比较(实o)
{
返回0;
}       
}

由于您希望能够将
Real
对象与
对象
进行比较,您可以将
实现可比
替换为
实现可比
。这与
Comparable
javadoc一致,javadoc指出
可以将此对象与之进行比较的对象类型

然后您只需将当前代码更改为:

// No more @Override
public int compareToReal(Real other)
{
  // Logic.
}
public int compareTo(char givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(char[] givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(char[] givenValue, int offset, int count) 
{ return compareToReal(new Real(givenValue, offset, count)); }
public int compareTo(double givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(float givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(int givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(long givenValue) 
{ return compareToReal(new Real(givenValue)); }
@Override
public int compareTo(Object other) 
{ return compareToReal(new Real(other.toString())); }

你能带我们参观全班吗?
// No more @Override
public int compareToReal(Real other)
{
  // Logic.
}
public int compareTo(char givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(char[] givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(char[] givenValue, int offset, int count) 
{ return compareToReal(new Real(givenValue, offset, count)); }
public int compareTo(double givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(float givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(int givenValue) 
{ return compareToReal(new Real(givenValue)); }
public int compareTo(long givenValue) 
{ return compareToReal(new Real(givenValue)); }
@Override
public int compareTo(Object other) 
{ return compareToReal(new Real(other.toString())); }