gpt4 book ai didi

java - 为什么在这种情况下需要强制转换?

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:32 25 4
gpt4 key购买 nike

class MyClass {

private String str;
public MyClass(String str){
this.str = str;
}
public int compare(Object o) {
return str.compareTo(((MyClass)o).str); //line No.8
}
}

class Client {
public static void main(String[] args) {
MyClass m = new MyClass("abc");
MyClass n = new MyClass("bcd");
System.out.println(m.compare(n));
}
}

为什么在这段代码中,第 8 行中的强制转换 (MyClass)o 是必要的,尽管事实上客户端调用了带有参数的 compare 方法MyClass 类的实例?

当我将 MyClass 类中的 compare 方法修改为如下形式时:

   public int compare(Object o) {
System.out.println(o.getClass());
System.out.println(((MyClass)o).getClass());
return str.compareTo(((MyClass)o).str);
}

然后,客户端会产生如下结果:

class MyClass
class MyClass

因此我不明白为什么需要上面的转换以及为什么我不能那样做(不转换为 MyClass):

   public int compare(Object o) {
return str.compareTo(o.str);
}

因为当我这样做时,我得到了编译时错误:

str cannot be resolved or is not a field

最佳答案

这归结为编译器在编译时知道什么。在编译时,它知道将要传递给此方法的是 Object 类型。这意味着它可以保证与 Object 类关联的方法,但不能保证 MyClass 类型的方法。

因为 compare 方法接受类型为 Object 或子类的任何参数,所以您可以传入任何内容。如果我创建一个类 MyOtherClass像这样..

public class MyOtherClass {
public String notStr;
}

然后我做了类似的事情..

MyOtherClass myOtherClass = new MyOtherClass();
MyClass myClass = new MyClass();

myClass.compare(myOtherClass);

如果没有转换,您现在遇到的情况是在运行时,它会尝试访问不存在的字段。进行强制转换是为了保证对象的类型正确,否则它将在尝试访问该字段之前失败。

顺便说一句

我一直在广泛使用一种叫做 Groovy 的语言。它是一种本质上位于 Java 之上的语言,但它支持动态绑定(bind)和松散类型(这就是您在这里所追求的)之类的东西。如果您必须拥有这种功能,那么我建议您查看 documentation .

关于java - 为什么在这种情况下需要强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32320377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com