Java 将对象强制转换为字符串时ClassCastException,但将对象强制转换为自定义类时没有ClassCastException

Java 将对象强制转换为字符串时ClassCastException,但将对象强制转换为自定义类时没有ClassCastException,java,Java,看来我不理解Java中强制转换的基本概念。请解释为什么第一行有效,第二行无效 public int compareTo(Object o) { Person p = (Person) o; //no warning String s = (String) o; //warning about class cast exception return 0; } 这里有什么区别?为什么允许将对象投射到人?尝试反转: public int c

看来我不理解Java中强制转换的基本概念。请解释为什么第一行有效,第二行无效

  public int compareTo(Object o) {
        Person p = (Person) o; //no warning
        String s = (String) o; //warning about class cast exception
        return 0;
    }
这里有什么区别?为什么允许将对象投射到人?

尝试反转:

public int compareTo(Object o) {
    String s = (String) o; //no warning
    Person p = (Person) o; //warning about class cast exception
    return 0;
}
你会在第二次施展时得到同样的警告。这是因为声纳过梁关心上下文:它假设如果第一次施放成功,第二次将失败。

尝试反转:

public int compareTo(Object o) {
    String s = (String) o; //no warning
    Person p = (Person) o; //warning about class cast exception
    return 0;
}

你会在第二次施展时得到同样的警告。这是因为sonar linter关心上下文:它假设如果第一次施放成功,第二次将失败。

我认为编译器会允许这样做,正如您所说,这只是一个警告。对字符串的强制转换只有在其实际为字符串的情况下才会成功。在您的情况下,只有当o为null时,您的代码才会成功,这可能就是您收到此警告的原因。

我认为编译器会允许这样做,因为您说过这只是一个警告。对字符串的强制转换只有在其实际为字符串的情况下才会成功。在您的情况下,只有当o为null时,您的代码才会成功,这可能是您收到此警告的原因。

可能是因为
对象o
?它不能同时是
String
,因为
String
是最后一个类,
Person
不能扩展它。是的,亚历克斯说的。因此编译器可以保证您的强制转换将失败,因此它不允许这样做。可能是因为
objecto
Person
?它不能同时是
String
,因为
String
是最后一个类,
Person
不能扩展它。是的,亚历克斯说的。因此编译器可以保证您的强制转换将失败,因此它不允许这样做。