Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
И по коду таких вещей (приведение указателей к int при передаче в функции) очень много. Пока собрал проект, задолбался.
Интересно, что автор курил? Хотя, нет - тут уже что-то потяжелее.
import java.awt.Button;
import java.util.ArrayList;
import java.util.List;
public class T {
public static void main(final String[] args) {
final List<String> l = new ArrayList<String>();
Object o = l;
@SuppressWarnings("unchecked")
ArrayList<String> ll = (ArrayList<String>) o;
final Button b = new Button();
o = b;
ll = (ArrayList<String>) o;
}
}
компилится, и в рантайме, как положено,
Exception in thread "main" java.lang.ClassCastException: java.awt.Button cannot be cast to java.util.ArrayList
at T.main(T.java:13)
вижу, ВИЖУ как Object стал ArrayList (т.е. привёлся к нему) а потом привёлся к Button, так как ArrayList унаследован от Object , наблюдается явное риведение предка к наследнику, обратного приведения замечено не было
нене. здесь мы:
создали обьект ArrayList и сразу привели его к интерфейсу List
привели к Object
привели Object обратно к ArrayList
создали Button
присвоили Button Object'у
и затем попытались Object привести к ArrayList, зная, что на самом деле там лежит Button
у вас перепутано построение фразы "привести х к у"
ладно, ваша очередь кодить. Покажите, что вы хотели?
как говорит википедия "Приведе́ние ти́па (type conversion) — преобразование значения переменной одного типа в значение другого типа." когда был обявлен интерфейс он не имел никого значения и затем был приведён в значение типа ArrayList . а исключени выскачило не из-за того что o в котором значение типа ArrayList попытался стать Button а из-за того что Button не смог стать ArrayList
Правда по какой-то малообъяснимой причине миф о "говнистости плюсов" имеет хождение строго и исключительно среди говнокодеров. Я думаю это факт уже говорит сам за себя.
С подобными трюками (конвертирование между указателями и целыми) иногда приходится сталкиваться в callback-интерфейсах. Но бывает, что иногда какой-нибудь умник решит завести отдельный параметр для передачи произвольных пользовательских данных и использует для этой цели тип 'int'. Разумеется, использовать для этой цели тип 'int' - это классика говнокодирования. Если уж кому-то приспичило использовать для этого целый тип, то это должен быть 'uintptr_t'. А по уму такие "пользовательские параметры" должны передаваться через 'void *'.
Язык тут ни причем
вы попутали, это любой объект можно привести к object, а не наоборот.
приведите List или Button к Object
Object o = ls;
ArrayList<String> al=(ArrayList<String>) o;
явное приведение к ArrayList
конкурс на приведение наследника к предку продолжается
компилится, и в рантайме, как положено,
создали обьект ArrayList и сразу привели его к интерфейсу List
привели к Object
привели Object обратно к ArrayList
создали Button
присвоили Button Object'у
и затем попытались Object привести к ArrayList, зная, что на самом деле там лежит Button
у вас перепутано построение фразы "привести х к у"
ладно, ваша очередь кодить. Покажите, что вы хотели?
> исключени выскачило не из-за того что o в котором значение типа ArrayList попытался стать Button а из-за того что Button не смог стать ArrayList
вы опровергаете не мое утверждение, а его отрицание, как раз доказывая мое.
Это даже не спор. Просто человек путается в понятиях объявленного и реального типов объекта.
Вы идиот или притворяетесь?
вот мне не нравятся обои в цветочек. Но они в цветочек, не в говно 🙂
внезапно всё прояснилось