Java 实现可比较、可比较到名称冲突:“;具有相同的擦除,但两者都不覆盖另一个“;
我希望有一个接受实数的compareTo方法(一个处理任意大而精确的实数的类[好吧,只要目前长度小于2^31])和一个接受对象的compareTo方法,但Java不允许,我也没有足够的经验知道原因 我只是试图修改这个类来实现Comparable,我在下面得到了这些错误消息。我真的不明白错误消息的意思,但我知道这与我试图为类提供一些灵活性的可怕方式有关,我为每个方法提供了所有不同的方法签名,我可以通过删除compareTo(Object other)方法来修复它,但理想情况下我希望保留它。所以我真正想问的是:有没有一种方法可以在不删除compareTo(Object other)方法的情况下使这些错误消息消失?这些错误到底意味着什么 另外,我知道已经有一些内置的Java类,比如BigInteger和类似的东西,我正试图使用这个类,但我这样做是为了好玩/满足于与Project Euler()一起使用 以下是比较方法:Java 实现可比较、可比较到名称冲突:“;具有相同的擦除,但两者都不覆盖另一个“;,java,generics,overriding,comparable,erasure,Java,Generics,Overriding,Comparable,Erasure,我希望有一个接受实数的compareTo方法(一个处理任意大而精确的实数的类[好吧,只要目前长度小于2^31])和一个接受对象的compareTo方法,但Java不允许,我也没有足够的经验知道原因 我只是试图修改这个类来实现Comparable,我在下面得到了这些错误消息。我真的不明白错误消息的意思,但我知道这与我试图为类提供一些灵活性的可怕方式有关,我为每个方法提供了所有不同的方法签名,我可以通过删除compareTo(Object other)方法来修复它,但理想情况下我希望保留它。所以我真
@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())); }