Как передать универсальные параметры в Java - PullRequest
2 голосов
/ 05 августа 2011

В Java у меня есть два класса:

Class A
{
  public String ID;
  public Object Name;
}

Class B
{
  public String ID;
  public Object Name;
}

Я хочу иметь метод, в котором я могу передать его либо объект класса A, либо B:

public void SomeMethod(???  arg)
{
  String id = arg.ID;
  Object name= arg.Name;
}

Возможно ли этопередать объект класса A или B в этот метод?Если да, то как пишется подпись метода?

Единственное решение, которое я могу придумать, - это создать интерфейс, который реализует и класс A, и B, содержащий методы get и set для установки полей ID и Name.Тогда сигнатура метода будет параметром, тип которого является интерфейсом.Я надеялся, что, может быть, есть более простой способ, возможно, с дженериками?

Ответы [ 5 ]

4 голосов
/ 05 августа 2011

Вы правы в том, что вам нужно использовать интерфейс (или абстрактный класс) с соответствующими сигнатурами методов.Для Java два класса отличаются друг от друга (кроме Object) ничего общего.Вам необходимо создать иерархию классов, отражающую общность между ними.

2 голосов
/ 05 августа 2011

Использовать метод перегрузки .

public void SomeMethod(A arg)
{
  String id = arg.ID;
  Object name= arg.Name;
}

public void SomeMethod(B arg)
{
  String id = arg.ID;
  Object name= arg.Name;
}

Вы можете создать интерфейс и A и B реализовать его. Это действительно зависит от вашего приложения. Для небольших программ я бы просто использовал перегрузку методов, так как она просто привносит ненужную абстракцию в вашу программу.

Для более крупных приложений, где расширяемость является приоритетом, вы можете рассмотреть возможность использования интерфейса. Предположим, позже вы захотите написать классы C и D, которые также имеют SomeMethod(). Использование интерфейса позволяет вам не просматривать весь код и не перезагружать соответствующие методы снова и снова.

Если вы точно знаете, что A и B - это конец истории, тогда нет необходимости создавать интерфейс.

РЕДАКТИРОВАТЬ: Если есть много кода, который должен быть продублирован, создайте вспомогательный метод:

public void SomeMethod(A arg)
{
  HelpMePlease( arg.ID, arg.Name );
}

public void SomeMethod(B arg)
{
  HelpMePlease( arg.ID, arg.Name );
}

private void HelpMePlease( String id, Object name ) {
  // 1000 lines of code here
}
1 голос
/ 05 августа 2011

Обобщения предназначены для повышения безопасности типов во время компиляции.

То, о чем вы спрашиваете, похоже на что-то вроде концепций C ++ или различных других языков * duck typing .

В Java, если необходимо выполнить некоторую последовательность операций над двумя несопоставимыми типами, вам необходимо ввести интерфейс или прибегнуть к сценариям / отражению.

1 голос
/ 05 августа 2011

Вам не нужны универсальные типы.Простое наследование сделает всю работу

abstract class Base {
  public String ID;
  public Object Name;
}

class A extends Base {
}

class B extends Base {
}

public void SomeMethod(Base arg)
{
  String id = arg.ID;
  Object name= arg.Name;
}
0 голосов
/ 05 августа 2011

Определите два интерфейса, hasID и hasName, а затем:

public class MyClass<A extends hasID & hasName>{
    public void SomeMethod(A object) {
        String id = object.getID();
        Object name= object.getName();
    }
}

Где getID и getName определены на их интерфейсах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...