Java动态检查对象的类型

Java动态检查对象的类型,java,programming-languages,Java,Programming Languages,我了解到Java的类型系统遵循了一个不正确的子类型规则,因为它将数组视为协变数组。我在网上读到,如果一个方法的参数将被读取和修改,唯一的类型安全选项是不变性,这是有意义的,我们可以在Java中提供一些简单的例子 Java通过动态类型检查所存储对象的类型来实现这一规则的补丁在性能方面是否值得注意?我无法想象检查对象类型的附加指令会超过一个或两个。接下来的一个问题是,忽略运行时的任何性能差异,这是否等同于对数组使用未破坏的子类型规则?如果我的问题是基本的,请原谅我 我发现一篇文章似乎回答了你的问题:

我了解到Java的类型系统遵循了一个不正确的子类型规则,因为它将数组视为协变数组。我在网上读到,如果一个方法的参数将被读取和修改,唯一的类型安全选项是不变性,这是有意义的,我们可以在Java中提供一些简单的例子


Java通过动态类型检查所存储对象的类型来实现这一规则的补丁在性能方面是否值得注意?我无法想象检查对象类型的附加指令会超过一个或两个。接下来的一个问题是,忽略运行时的任何性能差异,这是否等同于对数组使用未破坏的子类型规则?如果我的问题是基本的,请原谅我

我发现一篇文章似乎回答了你的问题:

“Java提供了三种在运行时查找对象类型的不同方法:
instanceof
关键字、
getClass()
isInstance()
Java.lang.Class
方法。这三种方法中只有
getClass()
是一个精确查找对象类型的函数,而如果对象类型是超级类型,则其他函数也会返回true。”

由此看来,您应该能够编写
MyObject.getClass()
,这将返回objects类。或者您可以使用
MyObject.isInstance(TheObject)
,如果
MyObject
TheObject
,则返回true。第三,你应该能够:

if (MyObject instanceof TheObject) {
//your code
}
是指向网页的链接

此外,这里还有另一个帖子的链接,可能有助于澄清:

这里还有两个指向其他类似问题的链接:


我发现一篇文章似乎回答了你的问题:

“Java提供了三种在运行时查找对象类型的不同方法:
instanceof
关键字、
getClass()
isInstance()
Java.lang.Class
方法。这三种方法中只有
getClass()
是一个精确查找对象类型的函数,而如果对象类型是超级类型,则其他函数也会返回true。”

由此看来,您应该能够编写
MyObject.getClass()
,这将返回objects类。或者您可以使用
MyObject.isInstance(TheObject)
,如果
MyObject
TheObject
,则返回true。第三,你应该能够:

if (MyObject instanceof TheObject) {
//your code
}
是指向网页的链接

此外,这里还有另一个帖子的链接,可能有助于澄清:

这里还有两个指向其他类似问题的链接:


性能始终是一个棘手的问题。根据上下文,可以完全优化此类检查。例如:

public static void main(String[] args){
    Object[] array = new String[2];
    array[0] = "Hello, World!";//compiler knows this is safe
    System.out.println(array[0]);
    array[1] = new Object();//compiler knows this will throw
}
在这里,编译器在两个赋值过程中都可以访问数组的实际类型,因此运行时检查并不是绝对必要的(如果编译器足够聪明,它可以优化它们)

但是,在本例中,需要执行运行时检查:

public static void main(String[] args){
    Object[] array = Math.random()<.5? new String[2]: new Object[2];
    array[0] = "Hello, World!";//compiler knows this is safe
    System.out.println(array[0]);
    array[1] = new Object();//compiler must check array type
}
publicstaticvoidmain(字符串[]args){

Object[]array=Math.random()性能始终是一个棘手的问题。根据上下文,此类检查可能会完全优化。例如:

public static void main(String[] args){
    Object[] array = new String[2];
    array[0] = "Hello, World!";//compiler knows this is safe
    System.out.println(array[0]);
    array[1] = new Object();//compiler knows this will throw
}
在这里,编译器在两个赋值过程中都可以访问数组的实际类型,因此运行时检查并不是绝对必要的(如果编译器足够聪明,它可以优化它们)

但是,在本例中,需要执行运行时检查:

public static void main(String[] args){
    Object[] array = Math.random()<.5? new String[2]: new Object[2];
    array[0] = "Hello, World!";//compiler knows this is safe
    System.out.println(array[0]);
    array[1] = new Object();//compiler must check array type
}
publicstaticvoidmain(字符串[]args){

Object[]数组=Math.random()如果你投了反对票,你能至少告诉我我做错了什么吗?你是否发现这个问题有问题,这是一个重复的问题,或者你比我更擅长谷歌搜索?可能你投了反对票,因为你没有问代码问题或特定的问题。似乎这更适合讨论。如果你ownvote,你能至少告诉我我做错了什么吗?你是否发现这个问题有问题,如果这是一个重复的问题,或者你比我更擅长谷歌搜索?可能你被否决了,因为你没有问代码问题或特定的问题。似乎这更适合讨论。谢谢你的回答e响应!我没有编写任何代码;我更好奇的是每次插入对象时幕后会发生什么。是Java在插入对象时自动调用
isInstance()
,还是我必须自己调用?很遗憾,我不理解您的问题。
isInstance()
只是一个允许您检查对象的函数。为什么会自动调用它?事实上,您并没有提到它,我相信Java会自动读取您的代码并验证您只分配了实际存在的对象。例如,如果我编写了
int myInt=myString
String myString=“hi”
它会崩溃。感谢您的回复!我没有写任何代码;我更好奇的是每次插入对象时幕后会发生什么。是Java在我插入对象时自动调用
isInstance()
还是我必须自己调用?很遗憾,我不理解您的问题。
isInstance()
只是一个允许您检查对象的函数。为什么会自动调用它?事实上,您并没有提到它,我相信Java会自动读取您的代码并验证您只分配了实际存在的对象。例如,如果我编写了
int myInt=myString
String myString=“hi”
它会坏的。