我是Java中的Generics的新手。我对使用泛型的好处几乎没有怀疑。 请参考以下代码 -
<T extends Bounceable> void goGreen(T ob);
void goGreen(Bounceable ob);
这里Bounceable是一个界面。
有人可以解释一下上述定义的区别。它们都限制调用者将对象传递给它,而不是Bounceable类型。如果可以在界面风格中实现相同的代码,那么使用Generics有什么好处?提前谢谢。
答案 0 :(得分:6)
如果你没有像你的例子中那样返回任何东西,那么你通过使用泛型来获得任何东西。另一个声明同样有用。
另一方面,泛型允许您创建以下方法:
<T extends Bounceable> T goGreen(T ob);
这将返回与传入的类型相同的对象,在很多情况下会为您保存一个角色
从评论中引用@LuiggiMendoza的优秀例子:
假设您有Ball implements Bounceable
和Cellphone implements Bounceable
。当您将Ball
传递给此方法时,您希望该方法返回Ball
,而不是Cellphone
。
使用非通用方法无法实现这一目标。
答案 1 :(得分:0)
如果您希望它返回与之相同的类型,该怎么办?
class Ball implements Bounceable{
void throw(Object target){
//impl
}
}
Bounceable goGreen(Bounceable ob);//returns a Bounceable back. no throw method
<T extends Bounceable> T goGreen(T ob);//returns a ball back when called with ball. I can throw it!
如果您想以另一种方式限制类型,该怎么办?
<T super Bounceable> void setBounceableParent(T ob);//not possible with just polymorphism
如果你想要一个适用于任何类型的课程怎么办?
class Holder<T>{
T data;
void put(T newData){
data=newData;
}
T get(){//how do you make this type safe without generics or duck typing?
return data;
}
}