在我的JAVA代码中出现的强制转换错误



我想知道为什么在java中不可能将接口实例传递给"Object"参数
以下是我的代码。

interface Comparable_{
public boolean greaterThan(Object obj);
}
class Max{
public static Comparable_ max(Comparable_ obj1, Comparable_ obj2){
if(obj1.greaterThan(obj2))//error occurs!
return obj1;
else
return obj2;
}
}
class Circle implements Comparable_{
public boolean greaterThan(Object obj){
if(this.radius > ((Circle)obj).radius)//error occurs
return true;
else
return false;
}
public double radius;
}
public class JavaProgram{
public static void main(String[] args){
Circle c1 = new Circle(); Circle c2 = new Circle();
c1.radius = 3; c2.radius = 5;
System.out.println( ((Circle)Max.max(c1, c2)).radius );
}
}

错误消息如下所示
"Comparable_类型中大于(Object(的方法不适用于参数(Comparable__(">
在我看来,由于obj2是Comparable_instance,因此可以将obj2传递给参数Object obj。
请告诉我这里出了什么问题:(


public class Test {
interface Comparable_ {
boolean greatherThan(Object obj);
}
static class SampleComparable implements Comparable_ {
@Override
public boolean greatherThan(final Object obj) {
return false;
}
}
static class Max {
public  Comparable_ max(final Comparable_ obj1, final Comparable_ obj2) {
if (obj1.greatherThan(obj2)) {
return obj1;
} else {
return obj2;
}
}
}
public static void main(final String[] args) {
final Max max = new Max();
System.out.println(max.max(new SampleComparable(), new SampleComparable()));
}
}

我知道这不是问题的答案。但由于我在评论中指出这个问题是不正确的,我想提供一些";证明;对于本声明。下面的代码可以完美地编译和执行,它使用了与问题中所示相同的结构。因此,我认为实际问题发生在其他地方,但由于所提供的代码是不可执行或不可测试的,因此进一步讨论这一点毫无意义。

更新:提供样本后

谢谢你提供了一个更好的例子。所提供的代码按照预期进行编译和执行,输出为5.0

我假设您看到的错误The method greatherThan(Object) in the type Comparable_ is not applicable for the arguments (Comparable_)是编译器错误(而不是运行时错误(。由于您在新示例中将方法的命名更改为greaterThan,因此现在的错误应该是The method greaterThan(Object) in the type Comparable_ is not applicable for the arguments (Comparable_)。我无法准确地重现这一点,但请看看下面的问题,也许回答这些问题会对你有所帮助。

所以接下来的问题是:

  • 您的类路径上还有其他东西吗,如注释中所述,如果您有任何地方"您自己的CCD_ 5类型";这可能会导致上面提到的问题(如果我在中添加这样一个类,我得到:Error:(13, 29) java: incompatible types: Comparable_ cannot be converted to Object
class Object {
// ...
}
  • 如何编译代码?可能是你有恶意的/坏的/。。。类路径上的库(如果可以的话,通常会在输出中看到包名称,所以我认为情况并非如此(

最新更新