Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java constructor using generic types

Tags:

java

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!

like image 495
Beer Me Avatar asked Mar 16 '10 18:03

Beer Me


2 Answers

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.

like image 189
Bozho Avatar answered Oct 04 '22 14:10

Bozho


Don't you mean:

item.breweryMethod();

instead of:

c.breweryMethod();

?

like image 25
bruno conde Avatar answered Oct 04 '22 13:10

bruno conde