当前位置: 首页 > 面试题库 >

是什么使对象分配与另一个类兼容?

夏元明
2023-03-14
问题内容

我想知道什么特别允许将一个类的对象转换为另一个类。查看Class.isInstance(Object
obj)javadoc,它表明一个对象必须与另一个类“赋值兼容”才能转换为该类。但是什么是“分配兼容”的呢?

我试图弄清楚以下内容如何返回ClassCastException:

public class A
{
    multiple private attributes
    No constructor
    multiple public methods
}

public class B extends A
{
    blank default constructor
    2 additional private attributes
    4 additional public getter / setter methods for these attributes
}

线

B b = (B)variable.getA()  // where getA() returned an instance of class A

返回ClassCastException A不能转换为B。我知道从父类转换为子类是一个坏主意。我没有编写有问题的代码,我只是在生产支持方面查看它。

类B是代码库中唯一从A扩展的类。因此,getA()的结果不是强制转换为A的A的另一个子类(例如C)的对象。

那么为什么在这种情况下Java不能将A类的对象强制转换为看似兼容的B类呢?


问题答案:

Class.isInstance(Object
obj)
的Javadoc
给出了以下定义assignment compatible

具体来说,
如果此Class对象表示一个声明的类,则如果指定的Object参数是所表示的类(或其任何子类)的实例,则此方法返回true;否则,此方法返回true
。否则返回false。如果此Class对象表示一个数组类,并且可以通过标识转换或扩展引用转换将指定的Object参数转换为该数组类的对象,则此方法返回true。否则返回false。
如果此Class对象表示一个接口,则如果指定Object参数的类或任何超类实现此接口,则此方法返回true;否则,此方法返回true
。否则返回false。如果此Class对象表示原始类型,则此方法返回false。

基本上,如果类型A扩展或实现类型B,则可以将类型A的对象分配给类型B的变量



 类似资料:
  • 我正在努力找出导致这个问题的原因。我对Java和BlueJ完全陌生,但我已经研究了几个小时,无法找出问题的原因。不断收到错误消息“不兼容类型:泥水匠无法转换为学徒”。非常感谢您的帮助。 //程序的目的:创建一个混合阵列,以容纳两个不同的学徒对象——泥水匠和木匠//泥水匠和木匠//然后将每个对象的所有细节显示在屏幕上。 学徒班就是这样的

  • 问题内容: 在给定的编程语言中,什么时候将对象或其他东西称为“一流”,为什么?它们与没有语言的语言有何不同? 编辑。当一个人说“一切都是对象”时(就像在Python中一样),他的确表示“一切都是一流的”吗? 问题答案: 简而言之,这意味着对对象的使用没有任何限制。它与任何其他对象相同。 第一类对象是可以动态创建,销毁,传递给函数,作为值返回并具有编程语言中其他变量所具有的所有权利的实体。 根据语言

  • 问题内容: 我正在玩Java的反射API,并尝试处理一些字段。现在,我要确定字段的类型。字符串很简单,只需执行即可。其他非派生类也是如此。但是,如何检查派生类?例如作为的子类。我无法找到任何或方法。我是否需要遍历所有人并自己找到超人? 问题答案: 您需要此方法: 一般情况下,(以上)应替换为并应替换为 从JavaDoc: 确定此对象表示的类或接口是否与指定参数表示的类或接口相同或超类或超接口。如果

  • 在我的应用程序中,我有一个单一的活动架构,我为每个片段定义了一个“视图”类。 这个“视图”类包含视图状态和视图操作,它们引用视图的数据和操作。 例如,我有一个“MainFragment.kt”和一个相关的“MainView.kt”文件,它是这样的: 然后导入“主状态”和“操作”,并在“主状态ragment.kt”及其“视图模型”类中使用。 正如您所见,“MainView”被定义为一个对象,因为我不

  • 问题内容: 上面的代码不会给出任何错误/警告。但是为什么相同的方法不适用于以下提到的代码? 我的问题是,由于int可以容纳所有字节值,为什么数组不是这种情况? 他们俩毕竟都持有住址。如果这对于ref变量是可行的,那将是 令人沮丧的 。 问题答案: 语言规范在Sec 4.10.3中 定义了数组类型之间的子类型化: 以下规则定义了数组类型之间的直接超类型关系: 如果和都是引用类型,则。 如果是原始类型