2014-10-30 69 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

相關問題