如果我有一个名为Widget
的类,那么我可以使用以下代码(或多或少)创建一个新类:
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 fruit = fruitClass.newInstance();
我得到了一个不同的错误:
类型不匹配:无法从捕获#2转换?果实。
那么如何使用String来实例化我想要的Fruit
具体结果?
答案 0 :(得分:2)
您可能只是忘记导入Fruit界面:
import com.foo.bar.Fruit;
注意:从不使用默认包。始终将您的课程放在一个包中。
其他注意:如果类的名称不是从某些外部资源(文件,数据库等)动态读取的,但是如您的问题所示是硬编码的,则应该只调用其构造函数:
Fruit f = new Apple();
答案 1 :(得分:2)
错误消息“Fruit无法解析为某种类型”意味着您的导入/构建路径设置不正确。
否则,您的代码看起来是正确的。
答案 2 :(得分:1)
您的代码没有任何问题。但是,您的Fruit类不在编译类路径中,因此编译器错误。