Приоритет перегруженных методов

У меня есть базовый класс под названием Элемент. Некоторые другие классы (как Маркировка и Изображение) оба расширяют этот класс.

У меня теперь есть класс диспетчеризации, имеющий следующие методы:

public class Dispatcher {
    public static AbstractPropertyEditor<Label> createEditor(Label e) {
    ...
    }

    public static AbstractPropertyEditor<Element> createEditor(Element e) {
    ...
    }
}

Если теперь у меня есть экземпляр Маркировки (который расширяет Элемент), и я хочу передать его createEditor(), почему большая часть общего метода (второй) названный? Не был бы это быть нормальным что самый определенный метод (createEditor(Label e)) назван?

Мне абсолютно нужен метод с Элементом-param, чтобы "поймать" все те классы, что a) реализуют Элемент, но не имеют их собственного определенного метода в этом классе диспетчеризации..

Я использую Java 6, как "зафиксировать" это?

Править: Хорошо, я должен признать, что это нисколько не о дженериках. Но это - то, где я встретился с ним в первый раз.

спасибо и всего наилучшего

5
задан Atmocreations 14 February 2010 в 22:26
поделиться

4 ответа

Почему бы вам:

  • make Element абстрактный класс, который предоставляет реализацию по умолчанию createEditor ()
  • make Метка переопределяет createEditor () .

Таким образом, вам не понадобятся статические утилиты, и вы добьетесь своей цели.

Если вам нужно, чтобы Элемент был интерфейсом, тогда:

  • определите createEditor () как методы Element
  • , определите EditorFactory интерфейс
  • предоставляют DefaultEditorFactory и ListEditorFactory
  • используют соответствующие фабрики в средствах реализации Element :

     public Editor createEditor () {{{1 }} editorFactory.createEditor (this); 
    } 
     

, где конкретный EditorFactory создается либо во время инициализации, либо посредством какой-то инъекции зависимостей.


По вашему конкретному вопросу - это зависит от того, какой тип вы там скомпилировали. Если вы вызовете createEditor (obj) , это будет зависеть от того, Element obj = .. или Label obj = ..

6
ответ дан 14 December 2019 в 01:07
поделиться

Поскольку вы, вероятно, делаете:

Element element = new Label();

Это определяется компилятором.

-121--4817509-

Используйте Page.Response.Redirect () внутри UserControls.

-121--4293751-

Это действительно имеет мало общего с дженериками, и все, что связано с перегрузкой методов. В Java сигнатура метода, вызываемая, определяется во время компиляции, а не во время выполнения, поэтому необходимо проверить и привести во время выполнения.

Таким образом, замените это:

 Element label = getLabel();
 AbstractPropertyEditor<?> editor = createEditor(label);   

на следующее:

 Element label = getLabel();
 AbtractPropertyEditor<?> editor;
 if(label instanceof Label) {
      editor = createEditor((Label) label);
 } else {
      editor = createEditor(label);
 }

Другой (более стандартный/лучший) способ исправить это - метод createEditor (Element) проверяет тип и вызывает с помощью приведения правильный перегруженный метод для подтипов. Однако при использовании методов, объявленных, возникнет проблема с параметрами возврата.

2
ответ дан 14 December 2019 в 01:07
поделиться

Из Спецификации языка Java :

Когда вызывается метод (§15.12), количество фактических аргументов (и любые аргументы явного типа) и типы аргументов времени компиляции используются во время компиляции , чтобы определить подпись вызываемого метода (§15.12.2). Если вызываемый метод является методом экземпляра , фактический вызываемый метод будет определен при запуске {{ 1}} time , используя поиск динамического метода (§15.12.4).

1
ответ дан 14 December 2019 в 01:07
поделиться

Вы можете продолжать использовать Response.Redirect () в UserControls.

-121--4293753-

Имела ли эта проблема истинную привязку HTTPS и такое же исключение: «Это может быть связано с тем, что сертификат сервера неправильно настроен с HTTP.SYS в случае HTTPS».... После двойной проверки кода и конфигурации, похоже, сообщение об ошибке не так вводит в заблуждение, как внутренние исключения, поэтому после быстрой проверки мы выяснили, что порт 443 был подключен skype (на сервере dev). Я рекомендую вам взглянуть на то, что задерживает запрос (Fiddler может помочь здесь), и убедиться, что вы можете обратиться к фронту службы (просмотреть .svc в вашем браузере) и его метаданные.

Удачи.

-121--920652-

Поскольку вы, вероятно, делаете:

Element element = new Label();

Это определяется компилятором.

0
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: