检查传递给扩展给定类的方法的对象的最佳方法是什么?
目前我有一个方法需要发送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
}
然而,与上述代码相比,该代码对我来说有点脆弱。
欢迎任何帮助。 谢谢:))
答案 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的对象)才是有效参数..
我建议使用接口来定义允许不允许作为参数的内容。