我有一个方法,通常从列表中获取一个项目并具有以下标记:
myMethod(T item)
我想使用这种方法,但我知道我发送的方法是什么。
SpecificItem myItem = new SpecificItem();
myMethod((T) myItem);
这不适合我。这是不良代码的标志吗?
答案 0 :(得分:9)
myMethod
在泛型类中定义,有点像:
public class MyClass<T> {
T myItem;
public void myMethod(T item) {
// do Something with item
}
public T myOtherMethod() {
myMethod(myItem); // casting is not necessary
return myItem;
}
}
如果您实例化此类,则将变量类型T
与实际类型进行交换:
MyClass<SpecificItem > concreteClass = new MyClass<SpecificItem >();
如果您在此实例上调用myMethod
,则必须提供SpecificItem
,因为SpecificItem
是此实例的通用类型。
(我不确定我的帖子是否回答了您的问题,请发表评论,以便我可以改进)
答案 1 :(得分:2)
你编码接口更好。例如:
在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接口。这保持了方法排序(List)的前提条件,它假定给定的输入是可比较的List。
哦,我差点忘了你的问题。实际上它不是一个糟糕的代码,因为它的工作原理。我只想告诉你,有更好的方法可以做到这一点。
答案 2 :(得分:1)
你可能正在寻找这样的东西:
class C<? extends T> {
public void myMethod(T myItem) {
...
}
}
答案 3 :(得分:1)
你调用方法的方式看起来很奇怪。如果您已将通用方法声明为
public <T> void myMethod(T item);
编译器知道,T是一些抽象类型,你不需要为它输出一个输入参数。请确保,T未在代码中声明为某种特定类型。
upd:在这里查看示例:http://www.java2s.com/Tutorial/Java/0200__Generics/Usinggenericmethodstoprintarrayofdifferenttypes.htm
答案 4 :(得分:0)
可能更好的方法是使SpecificItem成为T的子类或使T成为接口并让SpecificItem实现它。