开发者

Java constructor using generic types

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 with ArrayList 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?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜