I'm having a hard time wrapping my head around Java generic types. Here's a simple piece of code that in my mind should work, but I'm obviously doing something wrong.
Eclipse reports this error in BreweryList.java:
The method breweryMethod() is undefined for the type <T>
The idea is to fill a Vector with instances of objects that are a subclass of the Brewery class, so the invocation would be something like:
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.be开发者_开发问答erme.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() {
}
}
I'm sure this is a complete-generics-noob question, but I'm stuck. Thanks for any tips!
item.breweryMethod();
instead of
c.breweryMethod();
You were attempting to call the method on the Class<T>
, not on the instance.
And actually, Eclipse reports
The method breweryMethod() is undefined for the type Class<T>
and it should be clear from this message what has happened.
(And after you fix that, you will also have to handle the exceptions declared by Class.newInstance()
)
As Tom Hawtin suggested in a comment, you'd better use a factory method instead of using reflection in your method, in order to create your object.
Don't you mean:
item.breweryMethod();
instead of:
c.breweryMethod();
?
First of all, to answer your question: In the loop it should be item.breweryMethod();
instead of c.breweryMethod();
I do not know what you plan to do, but it does not seem to be the best approach. Here are some suggestions how you could improve your code:
- Replace
Vector
withArrayList
if you do not need the list to be synchronized - Instead of extending a List implementation, consider using a list, or does your BreweryList provide more functionality than a standard list?
Aside from the probable typo mention above... I don't see any such method initBreweryFromObject()
defined anywhere in your sample code. This is the error then, no?
精彩评论