2014-10-30 2 views
1

У меня есть вопрос произнесения которого генерирует исключение: java.lang.ClassCastExceptionjava.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

ответ

1

LogManager.getlogger(name) возвращает org.apache.logging.log4j объекта (интерфейс)

ваш пытается сохранить этот объект в org.apache.logging.log4j.core.Logger объекта (реализации), он не будет работать. Вот пример:

Вы можете хранить строку в объекте:

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

спасибо Я пропустил, что эта функция возвращает интерфейс, а не объект, теперь понятно :) –

0

На английском языке пожалуйста! (На английском языке SVP!)

В коде:

MyLogger extends Logger 

означает, что вы можете бросить MyLogger к Logger, но вы не можете уверенно бросить Logger к MyLogger.

Например, если собака расширяет Животное -> вы можете сказать, что Собака является животным, но вы не можете сказать, что Животное всегда является Собакой!

+0

Спасибо, Оливье, понятно –

Смежные вопросы