Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java instanceof和getClass()don';I don’我没有按预期工作_Java_Inheritance - Fatal编程技术网

java instanceof和getClass()don';I don’我没有按预期工作

java instanceof和getClass()don';I don’我没有按预期工作,java,inheritance,Java,Inheritance,我有以下代码: protected LogEvent toLogEvent(LogRecord element) { ...... System.out.println("element.getClass():"+element.getClass()); System.out.println("element.getClass() == org.jboss.logmanager.ExtLogRecord.class:" + (element.getClass() == o

我有以下代码:

protected LogEvent toLogEvent(LogRecord element) {
    ......
    System.out.println("element.getClass():"+element.getClass());
    System.out.println("element.getClass() == org.jboss.logmanager.ExtLogRecord.class:" + (element.getClass() == org.jboss.logmanager.ExtLogRecord.class));
    System.out.println("element instanceof org.jboss.logmanager.ExtLogRecord:" + (element instanceof org.jboss.logmanager.ExtLogRecord));
    System.out.println("element instanceof java.util.logging.LogRecord:"+(element instanceof java.util.logging.LogRecord));
    System.out.println("element.toString():"+element.toString());
输出为:

09:20:51,544 INFO  stdout element.getClass():class org.jboss.logmanager.ExtLogRecord
09:20:51,545 INFO  stdout element.getClass() ==org.jboss.logmanager.ExtLogRecord.class:false
09:20:51,547 INFO  stdout element instanceof org.jboss.logmanager.ExtLogRecord:false
09:20:51,548 INFO  stdout element instanceof java.util.logging.LogRecord:true
09:20:51,549 INFO  stdout element.toString():org.jboss.logmanager.ExtLogRecord@2657c0ad
10:32:48,372 INFO  stdout (new ExtLogRecord()) instanceof  ExtLogRecord:true
10:32:48,374 INFO  stdout new ExtLogRecord(org.jboss.logmanager.Level.ALL,"","").getClass():class org.jboss.logmanager.ExtLogRecord
10:32:48,376 INFO  stdout LogRecord.class.getClassLoader():null
10:32:48,377 INFO  stdout ExtLogRecord.class.getClassLoader():"ModuleClassLoader for Module "org.tamin.tiba.logging.jboss.handlers:main" from local module loader@416a8198(roots: D:\java\jbossas\modules)
10:32:48,378 INFO  stdout LogRecord.class.getClassLoader() == ExtLogRecord.class.getClassLoader():false
ExtLogRecord
LogRecord
的子类

我的问题是:

  • 在第二行中,为什么输出为
    false
    ?显然,元素是
    ExtLogRecord
    的一个实例

  • 在第三行元素中,ExtLogRecord的instanceof
    返回
    false
    ,在第四行元素中,LogRecord的instanceof
    返回
    true
    。所以元素是一个
    LogRecord
    ,但它不是一个
    ExtLogRecord
    。这是怎么发生的

  • 更新:

    我添加了一些关于类加载的附加代码。输出为:

    09:20:51,544 INFO  stdout element.getClass():class org.jboss.logmanager.ExtLogRecord
    09:20:51,545 INFO  stdout element.getClass() ==org.jboss.logmanager.ExtLogRecord.class:false
    09:20:51,547 INFO  stdout element instanceof org.jboss.logmanager.ExtLogRecord:false
    09:20:51,548 INFO  stdout element instanceof java.util.logging.LogRecord:true
    09:20:51,549 INFO  stdout element.toString():org.jboss.logmanager.ExtLogRecord@2657c0ad
    
    10:32:48,372 INFO  stdout (new ExtLogRecord()) instanceof  ExtLogRecord:true
    10:32:48,374 INFO  stdout new ExtLogRecord(org.jboss.logmanager.Level.ALL,"","").getClass():class org.jboss.logmanager.ExtLogRecord
    10:32:48,376 INFO  stdout LogRecord.class.getClassLoader():null
    10:32:48,377 INFO  stdout ExtLogRecord.class.getClassLoader():"ModuleClassLoader for Module "org.tamin.tiba.logging.jboss.handlers:main" from local module loader@416a8198(roots: D:\java\jbossas\modules)
    10:32:48,378 INFO  stdout LogRecord.class.getClassLoader() == ExtLogRecord.class.getClassLoader():false
    
    更新2:

    其他类加载比较:

    10:43:14,113 INFO  stdout element.getClass().getClassLoader() == ExtLogRecord.class.getClassLoader():false
    10:43:14,115 INFO  stdout element.getClass().getClassLoader():ModuleClassLoader for Module "org.jboss.logmanager:main" from local module loader @576fb9a5 (roots: D:\java\jbossas\modules)
    

    当您传递一个
    LogRecord
    实例而不是子类实例时,您将获得这些输出。考虑到这两个类,并假设它们有一个0-arg构造函数,下面是使用2个实例调用该方法的结果:

    toLogEvent(new LogRecord());     // passing superclass instance
    System.out.println();
    toLogEvent(new ExtLogRecord());  // passing subclass instance
    
    输出:

    结果是显而易见的。超类的实例不是也不能是其任何子类的实例。类似地,
    LogRecord.class
    不能等于
    ExtLogRecord.class

    • 第二行输出为false,因为LogRecord.class不相等 到ExtLogRecord.class。您正在传递LogRecord实例,并且 对其子类执行相等性检查

    • 您的第三行输出为false,因为无法创建父类实例 它的子类的一个实例

    • 第四行输出为true,因为它是LogRecord的一个实例 阶级


    希望它有帮助

    我不希望
    LogRecord.class
    等于
    ExtLogRecord.class
    ,因为关系是,
    ExtLogRecord
    是-a
    LogRecord
    。我也不希望
    LogRecord
    ExtLogRecord
    的实例(出于上述相同的原因)。类的实例仅在类加载器中是不同的。在应用服务器的gubbins内部,许多不同的应用程序都可以使用自己的类加载器运行,事情可能会很奇怪。(抱歉,没有足够的JBoss专家专门回答任何形式的问题。)@Makoto元素的类是ExtLogRecord,如第1行和第5行所示。所以我希望第2行和第3行是正确的。如果它是LogRecord实例,那么为什么第1行说element.getClass():class org.jboss.logmanager.extLogRecord在运行时,该方法将在实际实例上调用。i、 e.ExtLogRecord实例被准确地传递给LogRecord参数类型上的方法。这是一个难题,因为它是一个
    ExtLogRecord
    ,但ExtLogRecord的
    元素实例返回false。这也让我很困惑。我们将询问Rohit Jain:)@mortezakhosravi
    元素。getClass()
    返回实际的对象类型,而不是引用类型。因此,对于
    LogRecord元素=newextlogrecord()
    ,它将为您提供
    ExtLogRecord.class
    @mortezakhosravi您确定第一次输出得到
    ExtLogRecord.class
    ?因为你们的输出似乎不现实,除非你们在场景中有两个不同的类加载器。如果它是
    ExtLogRecord.class
    ,那么它必须是
    ExtLogRecord
    的实例。这就是我的输出显示的原因。应用程序中有两个不同的类加载器?在我头上@我对JBoss一无所知。你能试着比较两个类的类加载器吗
    element.getClass().getClassLoader()==ExtLogRecord.class.getClassLoader()
    看看你得到了什么?@mortezakhosravi看到了吗?这两个类都是从不同的类加载器中加载的,因此结果也是如此。我不能对JBoss相关的问题作太多评论,但可能您可以提供更多关于如何以及从何处调用该方法的细节。