【问题标题】:What are the benefits of using Generics? [duplicate]使用泛型有什么好处? [复制]
【发布时间】:2014-09-10 01:12:50
【问题描述】:

我是 Java 泛型的新手。我对使用泛型的好处毫无疑问。 请参考以下代码 -

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

void goGreen(Bounceable ob);

这里 Bounceable 是一个接口。

谁能解释一下上述定义有什么区别。它们都限制调用者将非 Bounceable 类型的对象传递给它。如果可以在接口样式中实现相同的代码,那么使用泛型有什么好处?提前致谢。

【问题讨论】:

  • 好问题。我不知道使用第一种表示法的优点。
  • 仅仅因为你可以使用泛型,并不意味着你应该在所有情况下。泛型可以像任何功能一样被过度使用。

标签: java generics


【解决方案1】:

如果您在示例中没有返回任何内容,那么您没有通过使用泛型获得任何收益。另一个声明同样有用。

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

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

这会返回一个与您传入的类型相同的对象,这在很多情况下会为您节省演员。
引用 cmets 中 @LuiggiMendoza 的出色示例:
假设您有 Ball implements BounceableCellphone implements Bounceable。当您将Ball 传递给此方法时,您希望该方法返回Ball,而不是Cellphone

这是使用非泛型方法无法实现的。

【讨论】:

  • Bounecable goGreen(Bounceable ob) 呢?
  • 这是唯一的好处?或者还有什么?
  • @VinceEmigh 这不一样。该方法意味着您将传递和接收类T 的实例。假设您有Ball implements BounceableCellphone implements Bounceable。当您将Ball 传递给此方法时,您希望该方法返回Ball,而不是Cellphone
  • 我知道使用非泛型方法是不可能的,但它的优势是什么?在您看来,我怎样才能充分利用泛型?
  • @AndreDuarte 对于 OP 的自定义特定示例,没有其他好处。但请注意,这可以是流畅接口和构建器模式实现的一部分。
【解决方案2】:

如果你想让它返回它所接受的相同类型怎么办?

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;
   } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多