2014-10-30 122 views
1

我有一个投问题,其产生java.lang.ClassCastException例外:java.lang.ClassCastException与org.apache.logging.log4j.Logger

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.core.LoggerContext; 
import org.apache.logging.log4j.message.MessageFactory; 

public class MyLogger extends org.apache.logging.log4j.core.Logger { 

    MyLogger(LoggerContext context, String name, MessageFactory messageFactory) { 
     super(context, name, messageFactory); 
     // TODO Auto-generated constructor stub 
    } 

    public static MyLogger getLogger(String name) { 
     org.apache.logging.log4j.core.Logger logger_ = (org.apache.logging.log4j.core.Logger) LogManager 
      .getLogger(name); 
     return (MyLogger) logger_; 
    } 
} 

虽然这是同样的原则,因为这一个:

public class test { 

    private static class A { 

    } 

    private static class B extends A { 

    } 

    public static void main(String [] args) { 
     A a = new A(); 
     B b = new B(); 
     a = (A) b; 
    } 
} 

有人可以解释一下吗?

+0

你确定'LogManager.getLogger(name)'返回'MyLogger'的一个实例吗?为什么呢? – sp00m 2014-10-30 14:12:00

回答

1

LogManager.getlogger(name)返回org.apache.logging.log4j对象(接口)

您正试图存储在一个org.apache.logging.log4j.core.Logger对象(实现)这个对象,它不会工作。这里有一个例子:

可以存储一个String对象中的:

String s = "foo"; 
Object o = s; 

但你不能一个对象存储在一个字符串:

Object o = new Object(); 
String s = o; // Won't compile 

这里,对象是org.apache.logging.log4j和字符串是org.apache.logging.log4j.core.Logger

这里是一个解决方案:

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.core.LoggerContext; 
import org.apache.logging.log4j.message.MessageFactory; 

public class MyLogger extends org.apache.logging.log4j.core.Logger 
{ 
    MyLogger(LoggerContext context, String name, MessageFactory messageFactory) { 
     super(context, name, messageFactory); 
    } 

    public static Logger getLogger(String name) { 
     Logger logger_ = LogManager.getLogger(name); 
     return logger_; 
    } 
} 
+0

谢谢我错过了这个函数返回接口而不是对象,现在很清楚:) – 2014-10-30 14:42:05

0

英文请! (恩英语SVP!)

在您的代码:

MyLogger extends Logger 

意味着你可以投MyLogger到记录器,但你不能定投记录器MyLogger。

例如,如果狗延伸动物 - >你可以说狗是一种动物,但你不能说动物总是狗!

+0

谢谢Olivier,很清楚 – 2014-10-30 14:42:41

相关问题