У меня есть базовый класс под названием Элемент. Некоторые другие классы (как Маркировка и Изображение) оба расширяют этот класс.
У меня теперь есть класс диспетчеризации, имеющий следующие методы:
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, как "зафиксировать" это?
Править: Хорошо, я должен признать, что это нисколько не о дженериках. Но это - то, где я встретился с ним в первый раз.
спасибо и всего наилучшего
Почему бы вам:
Element
абстрактный класс, который предоставляет реализацию по умолчанию createEditor ()
Метка
переопределяет createEditor ()
. Таким образом, вам не понадобятся статические утилиты, и вы добьетесь своей цели.
Если вам нужно, чтобы Элемент
был интерфейсом, тогда:
createEditor ()
как методы Element
EditorFactory
интерфейс DefaultEditorFactory
и ListEditorFactory
используют соответствующие фабрики в средствах реализации Element
:
public Editor createEditor () {{{1 }} editorFactory.createEditor (this);
}
, где конкретный EditorFactory
создается либо во время инициализации, либо посредством какой-то инъекции зависимостей.
По вашему конкретному вопросу - это зависит от того, какой тип вы там скомпилировали. Если вы вызовете createEditor (obj)
, это будет зависеть от того, Element obj = ..
или Label obj = ..
Поскольку вы, вероятно, делаете:
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) проверяет тип и вызывает с помощью приведения правильный перегруженный метод для подтипов. Однако при использовании методов, объявленных, возникнет проблема с параметрами возврата.
Когда вызывается метод (§15.12), количество фактических аргументов (и любые аргументы явного типа) и типы аргументов времени компиляции используются во время компиляции , чтобы определить подпись вызываемого метода (§15.12.2). Если вызываемый метод является методом экземпляра , фактический вызываемый метод будет определен при запуске {{ 1}} time , используя поиск динамического метода (§15.12.4).
Вы можете продолжать использовать Response.Redirect () в UserControls.
-121--4293753-Имела ли эта проблема истинную привязку HTTPS и такое же исключение: «Это может быть связано с тем, что сертификат сервера неправильно настроен с HTTP.SYS в случае HTTPS».... После двойной проверки кода и конфигурации, похоже, сообщение об ошибке не так вводит в заблуждение, как внутренние исключения, поэтому после быстрой проверки мы выяснили, что порт 443 был подключен skype (на сервере dev). Я рекомендую вам взглянуть на то, что задерживает запрос (Fiddler может помочь здесь), и убедиться, что вы можете обратиться к фронту службы (просмотреть .svc в вашем браузере) и его метаданные.
Удачи.
-121--920652-Поскольку вы, вероятно, делаете:
Element element = new Label();
Это определяется компилятором.