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";
}