我很难绕过Java泛型类型。这是一段简单的代码,在我看来应该可行,但我显然做错了。
Eclipse在BreweryList.java中报告此错误:
The method breweryMethod() is undefined for the type <T>
我们的想法是使用Brewery类的子类对象实例填充Vector,因此调用类似于:
BreweryList breweryList = new BreweryList(BrewerySubClass.class, list);
BreweryList.java
package com.beerme.test;
import java.util.Vector;
public class BreweryList<T extends Brewery> extends Vector<T> {
public BreweryList(Class<T> c, Object[] j) {
super();
for (int i = 0; i < j.length; i++) {
T item = c.newInstance();
// breweryMethod() is an instance method
// of Brewery, of which <T> is a subclass (right?)
c.breweryMethod();
// "The method breweryMethod() is undefined
// for the type <T>"
}
}
}
Brewery.java
package com.beerme.test;
public class Brewery {
public Brewery() {
super();
}
protected void breweryMethod() {
}
}
BrewerySubClass.java
package com.beerme.test;
public class BrewerySubClass extends Brewery {
public BrewerySubClass() {
super();
}
public void brewerySubClassMethod() {
}
}
我确信这是一个完整的仿制品 - noob问题,但我被困住了。感谢您的任何提示!
答案 0 :(得分:9)
item.breweryMethod();
而不是
c.breweryMethod();
您试图在Class<T>
上调用该方法,而不是在实例上调用该方法。
实际上,Eclipse报告
类型Class&lt; T&gt;
未定义breweryMethod()方法
从这个消息中可以清楚地看到发生了什么。
(在你解决之后,你还必须处理Class.newInstance()
声明的异常)
正如Tom Hawtin在评论中建议的那样,为了创建对象,最好使用factory method而不是在方法中使用反射。
答案 1 :(得分:4)
你的意思是:
item.breweryMethod();
而不是:
c.breweryMethod();
答案 2 :(得分:2)
首先,回答你的问题:在循环中它应该是item.breweryMethod();
而不是c.breweryMethod();
我不知道你打算做什么,但它似乎不是最好的方法。 以下是一些如何改进代码的建议:
Vector
替换为ArrayList
答案 3 :(得分:1)
除了上面提到的可能的拼写错误之外......我没有在示例代码中的任何地方看到任何此类方法initBreweryFromObject()
。这是错误,不是吗?