- 1
public <T extends IOrderSubmitRequest & IApiStoreRef> Order buildOrderFromSubmitRequest(final T request) { ... }
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+123
public <T extends IOrderSubmitRequest & IApiStoreRef> Order buildOrderFromSubmitRequest(final T request) { ... }
Типы-пересечения для бедных. Нужна была функция, работающая с несколькими классами без общего предка, реализующими сразу два интерфейса.
Или, еще может быть, что объекты такого типа нереализуемы (в Яве ж нельзя явно выбрать метод какого интерфейса реализуется, или я не прав?), в принципе, или компилер такое не проверит?
Если интерфейсы параметризованы типами, то, поскольку в жабе женерики сделаны через type erasure, компилятор заподозрит конфликт и обругается:
error: name clash: <K>apply(K) in Foo and apply(T#2) in A have the same erasure, yet neither overrides the other
Не то, чтобы это сильно кому-то мешало, но ковырянтность там всякая...
Забреет, т.к. в одном классе не могут быть 2 метода с одинаковыми аргументами и разными возвращаемыми типами.
> один интерфейс хочет void foo(T); а второй void foo(K extends T)
Хрен знает, если честно... Я не помню как перегружаются дженерики. Ждем жабистов.
нельзя?
А оно тебе надо?
Всё-же - не явные преобразования и явные реализации методов интерфейса - достаточно опасная вещь.
И надо 10 раз подумать, а действительно-ли оно надо...
Единственное решение в Жабе, где нет нормальных типов-пересечений, приведено в оригинальном посте. В каком-нибудь Ceylon это писалось бы красивее:
Да, вот теперь НАМНОГО красивее.
myBigRedButton.setForegroundColor(Color. GREEN);
return BigRedButtonOnPressResultFactory.createBigRedButtonOnPressResult(myBigRedButton);
}