Перегрузка методов по типу возврата в Java - PullRequest
2 голосов
/ 24 ноября 2008

Могу ли я свернуть эти два метода "getFields" в один, используя обобщенные (второй метод предназначен для упаковки частного доступа), или мне следует переименовать второй в нечто уродливое, например "getFieldPackagePrivate"?

public interface IField {

}


class Field implements IField { // package private class

}


  public class IForm {


     public List<IField> getFields();

  }



public class Form {
  private List<Field> fields;


  public List<IField> getFields() {
    return this.fields;

  }

  List<Field> getFields() { // package visible
    return this.fields;

  }

}

базовое использование будет выглядеть так

// by interfece - from client code

  IForm form;
  List<IField> list = form.getFields();

// by class - from other classes in the same package
  Form form2;
  List<Field> list2 = forms2.getFields();

Идея состоит в том, чтобы иметь чистый, сохраняемый интерфейс для внешнего мира и удобный доступ (без потерь) из видимых пакетов реализации. В моем Field Class есть несколько методов, которые я не хочу видеть клиентом, но их нужно вызывать из других классов в том же пакете (как, например, setLabel и т. Д.)

Ответы [ 4 ]

3 голосов
/ 24 ноября 2008

Нет. Вы не можете иметь полиморфизм, основанный на типе возврата в Java.

3 голосов
/ 24 ноября 2008

Вы можете написать (согласно моему ответу на предыдущий вопрос):

public List<? extends IField> getFields()

но вы не можете перегрузить типом возвращаемого значения и не можете предоставить закрытый для пакета тип в открытом методе.

РЕДАКТИРОВАТЬ: С изменением вопроса ответ простой "нет". Вам придется переименовать другой метод.

0 голосов
/ 18 апреля 2012

Вы можете сделать это с помощью манипулирования байт-кодом, проверьте эту статью: http://today.java.net/pub/a/today/2008/07/31/return-type-based-method-overloading.html

0 голосов
/ 24 ноября 2008

После небольших экспериментов я нашел решение, основанное на ответе Джона Скита

Код выглядит следующим образом.

public interface IField {

}


class Field implements IField { // package private class

}


  public class IForm {


     public List<? extends IField> getFields();

  }



public class Form {
  private List<Field> fields;


  List<? extends Field> getFields() { // package visible - please note "extends Field" not "extends IField"
    return this.fields;

  }

}

теперь работает приведенная ниже точка

  IForm form;
  List<IField> list = form.getFields();

// by class - from other classes in the same package
  Form form2;
  List<Field> list2 = forms2.getFields();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...