2012-04-30 2 views
1

Если у меня есть класс с именем Widget то я могу создать новый с помощью следующего кода (более или менее):Java: Инстанцировать конкретный осущ по имени

Class<?> widgetClass = Class.forName("Widget"); 
Widget widget = (Widget)widgetClass.newInstance(); 

Но что если у меня есть интерфейс, Fruit и несколько конкретных реализаций (например, Apple, Orange и Kiwi)? Если я пытаюсь:

Class<?> fruitClass = Class.forName("Apple"); 
Fruit fruit = (Fruit)fruitClass.newInstance(); 

Я получаю сообщение об ошибке:

Fruit cannot be resolved to a type.

Если удалить явную отливку так:

Fruit fruit = fruitClass.newInstance(); 

я получаю другую ошибку:

Type mismatch: cannot convert from capture#2-of ? to Fruit.

Так как я могу использовать a Строка для создания экземпляра справа Fruit Конкреция Я хочу?

ответ

2

Вы, наверное, просто забыли импортировать интерфейс фрукты:

import com.foo.bar.Fruit; 

Примечание: НИКОГДА не использовать пакет по умолчанию. Всегда кладите свои классы в пакет.

Другое примечание: если имя класса не динамически считывается из какого-либо внешнего ресурса (файла, базы данных и т. Д.), Но жестко закодировано, как показано в вашем вопросе, вы должны просто вызвать его конструктор:

Fruit f = new Apple(); 
1

В коде нет ничего плохого. однако ваш класс Fruit не находится в пути класса компиляции, следовательно, ошибка компилятора.

2

Сообщение об ошибке «Fruit не может быть разрешено к типу» означает, что ваш импорт/путь сборки настроены неправильно.

В противном случае это похоже на то, что ваш код верен.

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