2015-05-15 3 views
0
package test; 
public interface Virtual { 
    String get(); 
} 


package test; 
public class Test implements Virtual { 

    static { System.out.println("hello"); } 
    public Test() { System.out.println("world"); } 

    @Override 
    public String get() { 
     return "Test clazz"; 
    } 
} 

//main method 
... 
Class<?> cls = Class.forName("test.Test", true, classLoader); // it prints "hello" 
Virtual instance = (Virtual) cls.newInstance(); 
// this gets ClassCastException: test.Test cannot be cast to test.Virtual 

Идея - получить виртуальный экземпляр, который является тестовой реализацией. Что случилось с этим сценарием?ClassCastException: невозможно создать экземпляр интерфейса

обновление: Наконец-то я получил его. Кажется, в test.get() был eror.

+0

Если вы удаляете свой листинг в 'Virtual instance = (Virtual) cls.newInstance();' как просто 'Virtual instance = cls.newInstance();' вы все еще получаете ошибку? –

+0

Это может помочь http://stackoverflow.com/questions/12383376/classcastexception-when-casting-class-forname-object-to-interface-implemented-by –

+0

@CaptainMan в этом случае не будет компилироваться из-за 'несоответствия типов : невозможно преобразовать из захвата # 2-из? к Virtual'. Но я могу получить только экземпляр объекта. –

ответ

0

Попробуйте удалить CAST (Virtual) Тип и заменить его Test:

Virtual instance = (Virtual) cls.newInstance(); 

Изменить это:

Virtual instance = Test.class.cast(cls.newInstance()); 

Вы не можете создать экземпляр Virtual, как это интерфейс. Однако вы можете присвоить экземпляр класса Test ссылочной переменной, которая имеет тип Virtual.

+0

Это невозможно сделать из-за того, что 'Test не может быть разрешен для типа ', потому что он был скомпилирован из исходного файла. –

+0

Я обновил свой ответ. Если он не работает, можете ли вы отправить более подробную информацию в свой первоначальный вопрос. например, исходный вопрос не говорит, что исходного файла нет. – hitz

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