我有一个方法,它通常从列表中获取一项,并具有以下签名:
myMethod(T item)我想使用这个方法,但我知道我发送的是什么方法。
SpecificItem myItem = new SpecificItem();
myMethod((T) myItem);我对此不太满意。这是错误代码的征兆吗?
发布于 2010-08-31 21:29:55
最好把代码写到界面上。例如:
在myMethod中:
<T extends <? super Item>> void (T item);这告诉编译器只接受泛型类型T,它是Item接口/类的实现/扩展。这将确保给定的输入类型正确。编译器保证了这一点。
在主类中:
Item myItem = new SpecificItem();上面给出的代码是最佳实践。习惯它吧。但是(我不鼓励这样做)你也可以这样写代码:
SpecificItem myItem = new SpecificItem();您可以阅读Java源代码。例如,在类java.util.Collections中。在sort(List)方法中,您可能会注意到Joshua Bloch确保给定的输入始终采用正确的格式。要尝试一下,请执行以下操作:
public class Class1 {
public static void main(String[] args) {
List<Class1> list = new ArrayList<Class1>();
Collections.sort(list);
}
}上面的代码会产生编译错误。要修复此编译错误,Class1必须实现接口Comparable。这保持了方法sort( List )的前提条件,即假设给定的输入是一个可比较的列表。
哦,我几乎忘了你的问题。实际上,这不是一个糟糕的代码,因为它可以工作。我只想告诉你,有一个更好的方法可以做到这一点。
发布于 2010-08-31 21:25:57
你可能正在寻找类似这样的东西:
class C<? extends T> {
public void myMethod(T myItem) {
...
}
}发布于 2010-08-31 21:31:54
调用该方法的方式看起来很奇怪。如果您已将泛型方法声明为
public <T> void myMethod(T item);编译器知道,T是某种抽象类型,您不应该向它强制转换输入参数。只要确保T没有在代码中声明为某个特定类型即可。
更新:查看这里的示例:http://www.java2s.com/Tutorial/Java/0200__Generics/Usinggenericmethodstoprintarrayofdifferenttypes.htm
https://stackoverflow.com/questions/3609374
复制相似问题