1

如果我有一个名为的类Widget,那么我可以使用以下代码(或多或少)创建一个新类:

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

但是如果我有一个接口 ,Fruit和几个具体的实现(例如Apple,OrangeKiwi)呢?如果我尝试:

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

我收到一个错误:

Fruit 无法解析为类型。

如果我像这样删除显式转换:

Fruit fruit = fruitClass.newInstance();

我得到一个不同的错误:

类型不匹配:无法从 capture#2-of 转换?到水果。

那么如何使用 String 来实例Fruit化我想要的正确混凝土呢?

4

3 回答 3

2

你可能只是忘了导入 Fruit 接口:

import com.foo.bar.Fruit;

注意:切勿使用默认包。始终将您的课程放在一个包中。

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

Fruit f = new Apple();
于 2012-04-30T18:24:00.707 回答
2

错误消息“水果无法解析为类型”意味着您的导入/构建路径设置不正确。

否则,看起来您的代码是正确的。

于 2012-04-30T18:24:19.937 回答
1

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

于 2012-04-30T18:24:11.623 回答