2010-03-16 85 views
5

我很难绕过Java泛型类型。这里有一段简单的代码应该可以工作,但我显然做错了。使用泛型类型的Java构造函数

Eclipse中报告这个错误在BreweryList.java:

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

的想法是,以填补这是啤酒类的子类对象的实例的矢量,所以调用会是这样的:

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

我敢肯定,这是一个完全的仿制药 - 小白的问题,但我坚持。感谢您的任何提示!

+2

强烈建议使用自己的'BreweryFactory'而不是滥用'Class'。如果你能合理地避免反思,那就这样做。 – 2010-03-16 19:12:38

+4

http://stackoverflow.com/对于编程相关的问题要好得多。 – 2010-03-16 19:32:07

+0

几个小时前我看到过这个问题。 – Roman 2010-03-16 23:23:59

回答

9
item.breweryMethod(); 

代替

c.breweryMethod(); 

您试图呼吁Class<T>的方法,而不是实例。

而实际上,Eclipse的报告

的方法breweryMethod()是未定义的类型类<牛逼>

,它应该是从这个消息发生了什么事不清楚。

(你修复后,你还必须处理由Class.newInstance()声明的除外)

正如汤姆Hawtin在评论建议,你最好使用factory method,而不是在你的方法使用反射,为了创造你的对象。

+0

Ach!当然,你是对的:物品而不是c。它在添加适当的“throws”子句后立即编译。 我会调查工厂方法。谢谢你的提示。 – 2010-03-17 16:15:27

+0

@Beer我所以这是一个明智的接受已经为你工作的答案(通过投票柜台下方的勾号) – Bozho 2010-03-17 16:20:57

+0

明白了......谢谢。 – 2010-03-17 17:25:34

4

不要你的意思是:代替

item.breweryMethod(); 

c.breweryMethod(); 

+0

是的。谢谢。最明显的错误往往是最难以看到的错误。 – 2010-03-17 16:18:10

2

首先回答你的问题:在循环应该是item.breweryMethod();代替c.breweryMethod();

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

  • 更换VectorArrayList如果你不需要列表进行同步
  • 而是延伸的List实现的,使用列表考虑,或您的BreweryList是否提供比标准列表更多的功能?
+0

+1用于推荐Composition over Inheritance。 – helpermethod 2010-03-16 19:37:59

+0

另一个+1出于同样的原因 – Alb 2010-03-16 20:21:37

+0

BreweryList将提供更多的功能,因为它是远程MySQL数据库和智能手机显示之间的接口。我会看看ArrayList;事实上这可能会更好。谢谢。 – 2010-03-17 16:18:39

1

除了上面提到的可能的错字...我没有看到任何在您的示例代码中任何地方定义的方法initBreweryFromObject()。这是错误,不是吗?

相关问题