使用Generics有什么好处?

时间:2014-09-09 17:00:23

标签: java generics

我是Java中的Generics的新手。我对使用泛型的好处几乎没有怀疑。 请参考以下代码 -

<T extends Bounceable> void goGreen(T ob);

void goGreen(Bounceable ob);

这里Bounceable是一个界面。

有人可以解释一下上述定义的区别。它们都限制调用者将对象传递给它,而不是Bounceable类型。如果可以在界面风格中实现相同的代码,那么使用Generics有什么好处?提前谢谢。

2 个答案:

答案 0 :(得分:6)

如果你没有像你的例子中那样返回任何东西,那么你通过使用泛型来获得任何东西。另一个声明同样有用。

另一方面,泛型允许您创建以下方法:

<T extends Bounceable> T goGreen(T ob);

这将返回与传入的类型相同的对象,在很多情况下会为您保存一个角色 从评论中引用@LuiggiMendoza的优秀例子:
假设您有Ball implements BounceableCellphone 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;
   } 
}