使用泛型类型的Java构造函数
我很难绕过Java泛型类型。这里有一段简单的代码应该可以工作,但我显然做错了。使用泛型类型的Java构造函数
Eclipse中报告这个错误在BreweryList.java:
The method breweryMethod() is undefined for the type <T>
的想法是,以填补这是啤酒类的子类对象的实例的矢量,所以调用会是这样的:
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() {
}
}
我敢肯定,这是一个完全的仿制药 - 小白的问题,但我坚持。感谢您的任何提示!
item.breweryMethod();
代替
c.breweryMethod();
您试图呼吁Class<T>
的方法,而不是实例。
而实际上,Eclipse的报告
的方法breweryMethod()是未定义的类型类<牛逼>
,它应该是从这个消息发生了什么事不清楚。
(你修复后,你还必须处理由Class.newInstance()
声明的除外)
正如汤姆Hawtin在评论建议,你最好使用factory method,而不是在你的方法使用反射,为了创造你的对象。
Ach!当然,你是对的:物品而不是c。它在添加适当的“throws”子句后立即编译。 我会调查工厂方法。谢谢你的提示。 – 2010-03-17 16:15:27
@Beer我所以这是一个明智的接受已经为你工作的答案(通过投票柜台下方的勾号) – Bozho 2010-03-17 16:20:57
明白了......谢谢。 – 2010-03-17 17:25:34
不要你的意思是:代替
item.breweryMethod();
:
c.breweryMethod();
?
是的。谢谢。最明显的错误往往是最难以看到的错误。 – 2010-03-17 16:18:10
首先回答你的问题:在循环应该是item.breweryMethod();
代替c.breweryMethod();
我不知道你打算做什么,但它似乎并没有最好的方法。 这里有一些建议,你如何改进你的代码:
- 更换
Vector
与ArrayList
如果你不需要列表进行同步 - 而是延伸的List实现的,使用列表考虑,或您的BreweryList是否提供比标准列表更多的功能?
+1用于推荐Composition over Inheritance。 – helpermethod 2010-03-16 19:37:59
另一个+1出于同样的原因 – Alb 2010-03-16 20:21:37
BreweryList将提供更多的功能,因为它是远程MySQL数据库和智能手机显示之间的接口。我会看看ArrayList;事实上这可能会更好。谢谢。 – 2010-03-17 16:18:39
除了上面提到的可能的错字...我没有看到任何在您的示例代码中任何地方定义的方法initBreweryFromObject()
。这是错误,不是吗?
强烈建议使用自己的'BreweryFactory'而不是滥用'Class'。如果你能合理地避免反思,那就这样做。 – 2010-03-16 19:12:38
http://stackoverflow.com/对于编程相关的问题要好得多。 – 2010-03-16 19:32:07
几个小时前我看到过这个问题。 – Roman 2010-03-16 23:23:59