使用泛型类型的Java构造函数

时间:2010-03-16 18:42:39

标签: java

我很难绕过Java泛型类型。这是一段简单的代码,在我看来应该可行,但我显然做错了。

Eclipse在BreweryList.java中报告此错误:

The method breweryMethod() is undefined for the type <T>

我们的想法是使用Brewery类的子类对象实例填充Vector,因此调用类似于:

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() {
    }
}

我确信这是一个完整的仿制品 - noob问题,但我被困住了。感谢您的任何提示!

4 个答案:

答案 0 :(得分:9)

item.breweryMethod();

而不是

c.breweryMethod();

您试图在Class<T>上调用该方法,而不是在实例上调用该方法。

实际上,Eclipse报告

  

类型Class&lt; T&gt;

未定义breweryMethod()方法

从这个消息中可以清楚地看到发生了什么。

(在你解决之后,你还必须处理Class.newInstance()声明的异常)

正如Tom Hawtin在评论中建议的那样,为了创建对象,最好使用factory method而不是在方法中使用反射。

答案 1 :(得分:4)

你的意思是:

item.breweryMethod();

而不是:

c.breweryMethod();

答案 2 :(得分:2)

首先,回答你的问题:在循环中它应该是item.breweryMethod();而不是c.breweryMethod();

我不知道你打算做什么,但它似乎不是最好的方法。 以下是一些如何改进代码的建议:

  • 如果您不需要同步列表
  • ,请将Vector替换为ArrayList
  • 不考虑扩展List实现,而是考虑使用列表,或者BreweryList是否提供比标准列表更多的功能?

答案 3 :(得分:1)

除了上面提到的可能的拼写错误之外......我没有在示例代码中的任何地方看到任何此类方法initBreweryFromObject()。这是错误,不是吗?