使用泛型类型的Java构造函数
我很难理解Java泛型类型。这里有一段简单的代码,在我看来应该是可行的,但我显然做错了什么 Eclipse在BreweryList.java中报告此错误:使用泛型类型的Java构造函数,java,Java,我很难理解Java泛型类型。这里有一段简单的代码,在我看来应该是可行的,但我显然做错了什么 Eclipse在BreweryList.java中报告此错误: The method breweryMethod() is undefined for the type <T> BreweryList.java package com.beerme.test; import java.util.Vector; public class BreweryList<T extends B
The method breweryMethod() is undefined for the type <T>
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>"
}
}
}
package com.beerme.test;
public class Brewery {
public Brewery() {
super();
}
protected void breweryMethod() {
}
}
package com.beerme.test;
public class BrewerySubClass extends Brewery {
public BrewerySubClass() {
super();
}
public void brewerySubClassMethod() {
}
}
BrewerySubClass.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>"
}
}
}
package com.beerme.test;
public class Brewery {
public Brewery() {
super();
}
protected void breweryMethod() {
}
}
package com.beerme.test;
public class BrewerySubClass extends Brewery {
public BrewerySubClass() {
super();
}
public void brewerySubClassMethod() {
}
}
我肯定这是一个完整的泛型noob问题,但我被卡住了。谢谢你的提示
item.breweryMethod();
而不是
c.breweryMethod();
您试图对类
而不是实例调用该方法
事实上,Eclipse报告
类型类的方法breweryMethod()未定义
从这个信息中应该可以清楚地看到发生了什么
(修复后,还必须处理Class.newInstance()
声明的异常)
正如Tom Hawtin在评论中所建议的,为了创建对象,最好在方法中使用a而不是使用反射。你的意思是:
item.breweryMethod();
而不是:
c.breweryMethod();
?首先,回答您的问题:在循环中,它应该是
item.breweryMethod()代码>而不是c.breweryMethod()代码>
我不知道你打算做什么,但这似乎不是最好的办法。
以下是一些如何改进代码的建议:
- 如果不需要同步列表,请将
Vector
替换为ArrayList
<> LIE不是扩展列表实现,而是考虑使用一个列表,或者您的BryWyLIST提供比标准列表更多的功能?
除了上面提到的可能的打字错误之外。。。在示例代码中,我没有看到任何这样的方法initBreweryFromObject()
。这就是错误所在,不是吗?强烈建议您使用自己的BreweryFactory
,而不要滥用类。如果你可以合理地避免反思,那么就这样做。对于编程相关的问题更好。我几个小时前就看过这个问题了。你确定行“c.initBreweryFromObject();”不是“item.initBreweryFromObject();”?假设是这样——出于同样的原因,另一个+1将提供更多功能,因为它是远程MySQL数据库和智能手机显示屏之间的接口。我来看看ArrayList;事实上,这可能会更好。谢谢,啊!当然,你是对的:项目而不是c。它现在在添加适当的“throws”子句后编译。我会调查工厂的方法。谢谢你的提示。@Beer Me on,所以最好接受一个对你有用的答案(通过投票柜台下方的勾号)Yes。谢谢显而易见的错误往往是最难发现的错误。