2012-04-30 77 views
1

实例化一个具体IMPL如果我有一个名为Widget类,那么我可以创建下面的代码一个新的(或多或少):Java语言:名称

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

但如果我有一个接口, Fruit,以及几个具体实现(如AppleOrangeKiwi)?如果我尝试:

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.

那么我该如何使用一个字符串来实例化Fruit结核我想要

回答

2

你可能只是忘了进口水果接口:

import com.foo.bar.Fruit; 

注:NEVER使用默认的包。总是把你的课程放在一个包里。

其他注意:如果类的名称不是从某个外部资源(文件,数据库,任何)动态读取的,而是如问题中所示的硬编码,则应该简单地调用其构造函数:

Fruit f = new Apple(); 
1

你的代码没有问题。但是,您的Fruit类不在编译类路径中,因此编译器错误。

2

错误消息“水果无法解析为某种类型”表示您的输入/构建路径设置不正确。

否则,它看起来像你的代码是正确的。