当前位置: 首页 > 面试题库 >

实现Comparable,compareTo名称冲突:“具有相同的擦除,但没有一个覆盖另一个”

郭远
2023-03-14
问题内容

我想要一个带有Real的compareTo方法(一个用于处理任意大而精确的实数的类[好吧,只要它现在的长度小于2 ^
31])和一个带有一个对象,但是Java不允许我这样做,而且我还没有足够的经验来知道为什么。

我只是试图修改该类以实现Comparable,并且在下面得到了这些错误消息。我不是很明白错误消息的含义,但是我知道这与我试图为类制作的每个方法提供所有不同方法签名的灵活性的可怕方式有关,我可以修复它可以通过删除compareTo(Object
other)方法来实现,但是理想情况下,我希望保留它。因此,我真正要问的是:是否有一种方法可以使这些错误消息消失而又不删除compareTo(Object
other)方法,这些错误的确切含义是什么?

另外,我知道已经有一些内置的Java类,例如BigInteger,以及类似的东西,这些都是我试图使用该类的目的,但我这样做是出于乐趣/满意度,以便与Project
Euler(https:// projecteuler.net/)。

Jake@Jake-PC /cygdrive/c/Users/Jake/Documents/Java/Mathematics
$ javac Real.java
Real.java:377: error: name clash: compareTo(Real) in Real overrides a method whose erasure is the same as another method, yet neither overrides the other
  public int compareTo(Real other)
             ^
  first method:  compareTo(Object) in Real
  second method: compareTo(T) in Comparable
  where T is a type-variable:
    T extends Object declared in interface Comparable
Real.java:440: error: name clash: compareTo(Object) in Real and compareTo(T) in Comparable have the same erasure, yet neither overrides the other
  public int compareTo(Object other)
             ^
  where T is a type-variable:
    T extends Object declared in interface Comparable
2 errors

这些是compareTo方法:

  @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) { ... }

这些方法具有相同的
Erase

,这意味着一旦编译器剥离了通用类型信息,就不再有在运行时区分它们的方法。

您的选择是消除compareTo(Object other)重载,或者Real实施Comparable<Object>

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

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

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


 类似资料:
  • 问题内容: 我有一个接口,当我尝试实现其方法之一时,出现以下错误:“名称冲突:GenericQueue中的enqueue(T#1)和IGenericQueue中的enqueue(T#2)具有相同的擦除,但是没有覆盖T#1,T#2是类型变量的另一个:T#1扩展了在类GenericQueue中声明的Comparable T#2扩展了在接口IGenericQueue中声明的Comparable,这是代码

  • 我有一个接口,当我尝试实现它的一个方法时,我得到了这个错误:“名称冲突:GenericQueue中的enqueue(T#1)和IGenericQueue中的enqueue(T#2)具有相同的擦除,但两者都不重写另一个,其中T#1,T#2是类型变量:T#1扩展在类GenericQueue中声明的Comparable T#2扩展在接口IGenericQueue中声明的Comparable”下面是代码:

  • 问题内容: 我收到此名称冲突错误,我不知道该怎么解决。我有两个类,我正在使用重载的方法“ createSensors”。为了简化,这里是产生问题的代码: 问题答案: 通用解决方案是使用不同的名称。这些方法可以在没有继承关系的类中,因为它们不是实例方法。 如所指出的,问题中的方法实现是相同的(典型值除外)。 (此重载问题经常与擦除运行时类型混淆。重载是链接时而非动态问题,因此可以在语言中轻松解决。这

  • 问题内容: 我有超一流的Foo。还有一个扩展它的类Bar。 在Foo中的功能: 酒吧功能: 出现错误: 我究竟做错了什么? 问题答案: 您正在使用不兼容的类型覆盖该方法。也许您想做类似的事情: 功能在 和功能在酒吧:

  • 问题内容: 我的模型与现场 函数根据图像文件名命名。 但是,当用户更新头像时,新的头像名称与旧的头像名称一致,并且Django在文件名中添加后缀。 有办法覆盖文件而不是创建新文件吗? 问题答案: 是的,这对我也很重要。这就是我所做的。 模型: 还定义在中: 在另一个文件中,: 显然,这些是这里的示例值,但是总体而言,这对我来说效果很好,并且根据需要进行修改应该非常简单。

  • 我有广泛的基本特征。有些类型只关心其功能的子集,所以我添加了一个子集,要求用户实现更小的功能集。 此代码失败: 出现以下错误: 有趣的是,当我删除上的通用性时,它就起作用了: stackoverflow上的其他一些帖子也提到了类似的问题,但它们通常都有关于外来特征的问题(来自标准库的)。在我的案例中,特质和类型都是本地的,因此就我所知,孤儿规则不应该生效。 基本上,错误提到下游板条箱可能实现tra