Java海关类实例可以';不要随波逐流。为什么?

Java海关类实例可以';不要随波逐流。为什么?,java,Java,为什么实例可以强制转换为列表,但不能强制转换为字符串 class A{} ... A a = new A(); List list = (List)a; //pass String s = (String)a; //compile error 引述: 如果对于任何两个类(非接口)Vi和Vj,Vi不是Vj的子类,或者反之亦然,则这是编译时错误 String和A是不相关的类,因此它是编译时错误列表是一个接口,因此不会导致相同的错误 请注意,您的断言 可以强制转换为列表的实例 不太正确:A不

为什么实例可以强制转换为列表,但不能强制转换为字符串

class A{}
...
A a = new A();
List list = (List)a;   //pass
String s = (String)a;  //compile error 
引述:

如果对于任何两个类(非接口)Vi和Vj,Vi不是Vj的子类,或者反之亦然,则这是编译时错误

String
A
是不相关的类,因此它是编译时错误<代码>列表是一个接口,因此不会导致相同的错误

请注意,您的断言

可以强制转换为列表的实例


不太正确:
A
不能强制转换到
列表
;这只是一个运行时故障,而不是编译时故障。

根据规范,编译器在执行这些强制转换检查时,只考虑声明的
a
类型

所以,你写:

A a = new A();
但是编译器只考虑

A a; // = <something>;
而且,由于编译器只考虑声明的类型,因此它必须假定您也可能将
new B()
分配给
a

因此,由于
a
的子类可以实现接口
List
,编译器不能假设转换到
List
总是失败


当然,强制转换在实践中会失败——在运行时。但不是在编译时。

Java中的类只能转换为它的一个超类型,或它的一个超类型上的一个接口

在您的例子中,类
A
不是
String
的子类。因此,
A
不能转换为
字符串
。另外,
String
是最后一个类,因此您不能编写可以转换为
String
的类
a

Java已经认识到需要轻松地将类显示为字符串,特别是出于调试/记录目的。为了满足这一需求,
Object
类附带了一个
toString()
方法。由于所有Java类都是从
对象
类扩展而来,因此所有Java类都包含
toString()方法的实现

重要的是要记住,
toString()
方法的存在并不意味着
a
是一个字符串,而是意味着您可以从
a
获取一个字符串,该字符串在某种程度上描述了
a
实例。如果您发现所提供的描述不符合您的目的,您可以重写
A
toString()
方法并返回更好的描述,如下所示

@Override
public String toString() {
  return "my better description";
}

由于重写是用Java编写的,您还可以包含任何变量或其他最终可以转换为字符串的项(因为所有对象都有
toString()
几乎包含任何内容)。

因为。。。这不是字符串。添加到Andy的答案列表是一个接口,而字符串是类。如果在list中调用该方法,那么它将抛出error,但它也不是list…显然,类a不是list。那么,这不应该也是抛出错误吗?请看,嘿@ShadowDroid-我拒绝了你的编辑,因为我不想因为你的洞察力而受到赞扬。请随意评论,或者作为答案提交,我将很乐意投票。我不会帮助获得信用/投票。我只是对分享知识感兴趣。总之@Erwin发布了一个带有详细样本的答案。
@Override
public String toString() {
  return "my better description";
}