Java确保传递给方法的对象扩展给定的类

时间:2010-07-27 16:03:32

标签: java abstract-class typechecking

检查传递给扩展给定类的方法的对象的最佳方法是什么?

目前我有一个方法需要发送ByteBuffer数据和我写的'player'类,并将数据排队到IO服务器上发送给客户端:

public void send(ButeBuffer toSend, Player player)
{
  // prep the byte buffer for sending, and queue it on the IO server
}

我希望能够做的是让玩家对象传入任何扩展玩家类的对象。我做了一些搜索,发现了类似的东西:

public void send(ByteBuffer toSend, Player<? extends Player> player)
{   
   // prep the byte buffer for sending, and queue it on the IO server
}

但这给了我编译错误,我不明白到底发生了什么。这是正确的方法吗?如果是这样,任何人都可以解释这段代码的具体行为以及它为什么不起作用,或者将我链接到一篇更详细解释这一点的文章。

另外,我想我可以设置这样的东西:

public void send(ByteBuffer toSend, Object player)
{
  // Check that the player extends Player, using instanceof or something 
  // along those lines   

  // Prep the ByteBuffer, and queue the data to send
}

然而,与上述代码相比,该代码对我来说有点脆弱。

欢迎任何帮助。 谢谢:))

4 个答案:

答案 0 :(得分:7)

如果我没有弄错的话,你可以保留第一个语法(期望一个Player对象),它可以用于Player的任何子类。这是多态性。

答案 1 :(得分:3)

您当前对send的定义已接受Player的任何子类(或实现,如果您以后决定使Player成为接口)。

答案 2 :(得分:2)

目前,您的方法将接受Player的任何子类(如果您使用第一种方法)。但是如果你想用接口做这个(为了确保实现特定的方法并且你可以调用它们),你可以尝试对类进行泛化并做类似的事情:

public class MyClass<T extends PlayerInterface> {
   public void send(ByteBuffer toSend, T player) {    
      // prep the byte buffer for sending, and queue it on the IO server
   }  
}

但这可能是矫枉过正的。在这种情况下,您可能最好只使用接口作为参数:

public void send(ByteBuffer toSend, PlayerInterface player) {    
   // prep the byte buffer for sending, and queue it on the IO server
}  

答案 3 :(得分:2)

你第一种方法很好。

public void send(ButeBuffer toSend, Player player)
{
  // prep the byte buffer for sending, and queue it on the IO server
}

它确保只有Player类型的对象(或扩展Player的对象)才是有效参数..

我建议使用接口来定义允许不允许作为参数的内容。