Java: есть ли способ автоматически привести возвращаемое значение? - PullRequest
0 голосов
/ 20 января 2011

У меня есть два класса:

public abstract class Arguments {
    public List execute() {
        // do some stuff and return a list
    }
}

// and a child :
public class ItemArguments {
    public List<Item> execute() {
        return super.execute();
    }
}

Как видите, метод execute в ItemArguments немного бесполезен, но без него мне придется приводить все свои вызовы метода execute в Arguments.

Есть ли способ удалить метод execute в ItemArguments и избежать того, чтобы приведение делало там, где выполняются вызовы?

Спасибо за вашу помощь!

1 Ответ

10 голосов
/ 20 января 2011

Дженерики

public abstract class Arguments<T> {
  public List<T> execute() {
    // some stuff
    return new ArrayList<T>();
  }
}

public class ItemArguments extends Arguments<Item> {

}

Вам даже не нужно создавать подклассы, если у вас нет других причин для этого

public class Arguments<T> {
  public List<T> execute() {
    // blah
  }
}

Arguments<Item> o1 = new Arguments<Item>();
List<Item> o2 = o1.execute();

Вызов методов на T не так прост. T стирается компилятором и поэтому недоступен во время выполнения. Легкий для понимания обходной путь - переходить в класс при создании экземпляра Arguments

public class Foo {
  public static void something() { ... }
}

public class Arguments<T extends Foo> {
  private Class<? extends Foo> foo;
  public Arguments(Class<? extends Foo> foo) {
    this.foo = foo;
  }
  public List<T> execute() {
    foo.something();

  }
}

Есть лучшие способы, но это в основном понятно, не будучи мастером шаблонов:)

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