Java гарантирует, что объект, переданный методу, расширяет данный класс - PullRequest
1 голос
/ 27 июля 2010

Каков наилучший способ проверить, передается ли объект в метод, расширенный заданным классом?

В настоящее время у меня есть метод, который принимает ByteBuffer данных для отправки, и класс 'player', которыйя написал и поставил в очередь данные на сервере ввода-вывода для отправки клиенту:

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 ]

7 голосов
/ 27 июля 2010

Если я не ошибаюсь, вы можете сохранить первый синтаксис (ожидая объект Player), и он будет работать с любым подклассом Player. Это полиморфизм.

3 голосов
/ 27 июля 2010

Ваше текущее определение send уже принимает любой подкласс Player (или реализацию, если позже вы решите сделать Player интерфейсом).

2 голосов
/ 27 июля 2010

Первый метод подходит.

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

Он гарантирует, что только объекты типа Player (или объекты, расширяющие Player) являются допустимыми параметрами.определить, что разрешено, а что не разрешено в качестве параметра.

2 голосов
/ 27 июля 2010

В настоящее время ваш метод будет принимать любой подкласс Player (если вы используете первый метод).Но если вы хотите сделать это с помощью интерфейса (чтобы обеспечить реализацию определенных методов и возможность их вызова), вы можете попробовать обобщить класс и сделать что-то вроде этого:быть излишним.В этом случае вам лучше использовать интерфейс в качестве параметра:

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