2013-04-04 72 views
1

我想在java中使用泛型方法第一次。它不工作,而且在我看来,Java泛型并不意味着以这种方式使用 - 我需要实现一个通用接口,而不是使用泛型方法。请确认(或否认)该结论。在Java中使用泛型方法参数

这就是我想要做的事:

public <T> void updateItem(T item) { 
    String itemKey = item.getKey(); 
    ... 

这给我的错误“的方法信息getKey()是未定义的类型T”。

寻找为什么这不起作用,我看到类型擦除“如果类型参数是无界的,则用泛界限或对象替换泛型中的所有类型参数”。

我可以'绑定'我的类型T的唯一方法是如果我为所有我打算使用的类型创建一个公共子类或接口,并且如果我这样做,那么我可以使用多态而不是泛型。

+0

看起来你想使用一个接口,而不是泛型。 – svz 2013-04-04 17:06:27

+1

T应该是什么?你可以使用'' – Supericy 2013-04-04 17:06:27

+0

我有这个想法(来自Python或C++),我不必指定T是什么。当使用类型调用T时,T将被类型检查。 – Tom 2013-04-04 17:07:45

回答

5

这是正确的。方法getKey()未在类T中定义。但是,如果将您的方法定义如下:

public <T extends Entry> void updateItem(T item) { 
    String itemKey = item.getKey(); 

编译器可以找到getKey()方法。请注意,我用<T extends Entry>(我的意思是​​)。这个类有方法getKey()和编译器可以解决它。

+0

是的,我有这个想法(从Python和C++),编译器不会试图解析调用,直到调用(或Python中的运行时),只要它按照使用方式工作就没问题。 – Tom 2013-04-04 17:10:57

+0

对我而言,奇怪的是,如果T有一个共同的基类(上面的Entry),那么我根本不需要泛型。 – Tom 2013-04-04 17:12:09

+1

@Tom这是正确的 - 只需要以'Entry'为例。有时多态足够了,你不需要泛型。 – 2013-04-04 17:13:14