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.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() {
}
}
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();
?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With