Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用泛型类型的Java构造函数_Java - Fatal编程技术网

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

使用泛型类型的Java构造函数,java,Java,我很难理解Java泛型类型。这里有一段简单的代码,在我看来应该是可行的,但我显然做错了什么 Eclipse在BreweryList.java中报告此错误: The method breweryMethod() is undefined for the type <T> BreweryList.java package com.beerme.test; import java.util.Vector; public class BreweryList<T extends B

我很难理解Java泛型类型。这里有一段简单的代码,在我看来应该是可行的,但我显然做错了什么

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

The method breweryMethod() is undefined for the type <T>
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>"
        }
    }
}
package com.beerme.test;

public class Brewery {

    public Brewery() {
        super();
    }

    protected void breweryMethod() {
    }
}
package com.beerme.test;

public class BrewerySubClass extends Brewery {
    public BrewerySubClass() {
        super();
    }

    public void brewerySubClassMethod() {
    }
}
BrewerySubClass.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>"
        }
    }
}
package com.beerme.test;

public class Brewery {

    public Brewery() {
        super();
    }

    protected void breweryMethod() {
    }
}
package com.beerme.test;

public class BrewerySubClass extends Brewery {
    public BrewerySubClass() {
        super();
    }

    public void brewerySubClassMethod() {
    }
}
我肯定这是一个完整的泛型noob问题,但我被卡住了。谢谢你的提示

item.breweryMethod();
而不是

c.breweryMethod();
您试图对
而不是实例调用该方法

事实上,Eclipse报告

类型类的方法breweryMethod()未定义

从这个信息中应该可以清楚地看到发生了什么

(修复后,还必须处理
Class.newInstance()
声明的异常)

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

你的意思是:

item.breweryMethod();
而不是:

c.breweryMethod();

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

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

  • 如果不需要同步列表,请将
    Vector
    替换为
    ArrayList
  • <> LIE不是扩展列表实现,而是考虑使用一个列表,或者您的BryWyLIST提供比标准列表更多的功能?
除了上面提到的可能的打字错误之外。。。在示例代码中,我没有看到任何这样的方法
initBreweryFromObject()
。这就是错误所在,不是吗?

强烈建议您使用自己的
BreweryFactory
,而不要滥用
类。如果你可以合理地避免反思,那么就这样做。对于编程相关的问题更好。我几个小时前就看过这个问题了。你确定行“c.initBreweryFromObject();”不是“item.initBreweryFromObject();”?假设是这样——出于同样的原因,另一个+1将提供更多功能,因为它是远程MySQL数据库和智能手机显示屏之间的接口。我来看看ArrayList;事实上,这可能会更好。谢谢,啊!当然,你是对的:项目而不是c。它现在在添加适当的“throws”子句后编译。我会调查工厂的方法。谢谢你的提示。@Beer Me on,所以最好接受一个对你有用的答案(通过投票柜台下方的勾号)Yes。谢谢显而易见的错误往往是最难发现的错误。