Re[15]: wat
От: dimgel Россия https://github.com/dimgel
Дата: 23.01.12 16:22
Оценка:
Здравствуйте, Eugeny__, Вы писали:

E__>И то, это не джава — это скала. В джаве так не извратиться — компилер сходу завернет это дело.


Ой, да що ви говорите!

dimgel@ascot ~/temp $ cat test.java                                                                                                                                                                                
class Test {                                                                                                                                                                                                       
        static class A {}                                                                                                                                                                                          
        static class B extends A {}                                                                                                                                                                                
        static class C extends A { void c() {} }                                                                                                                                                                   
        static C f(boolean isC, A a) {                                                                                                                                                                             
                return isC ? (C)a : null;                                                                                                                                                                          
        }                                                                                                                                                                                                          
                                                                                                                                                                                                                   
        public static void main(String args[]) {                                                                                                                                                                   
                B b = new B();                                                                                                                                                                                     
                C c = f(true, b);                                                                                                                                                                                  
                System.out.println("Hello, фигли");                                                                                                                                                                
        }                                                                                                                                                                                                          
}
dimgel@ascot ~/temp $ javac test.java 
dimgel@ascot ~/temp $ java Test
Exception in thread "main" java.lang.ClassCastException: Test$B cannot be cast to Test$C
        at Test.f(test.java:6)
        at Test.main(test.java:11)


Это essential-фича, неотъемлемое свойство таких кастов: либо они позволяют обманывать компилятор, либо их нет в языке вообще.
Re[2]: wat
От: Eugeny__ Украина  
Дата: 23.01.12 16:44
Оценка:
Здравствуйте, antonio_banderas, Вы писали:

_>Здравствуйте, Mamut, Вы писали:



M>>Люди саркастически издеваются над нашими любимыми языками программирования:


M>>https://www.destroyallsoftware.com/talks/wat


_>Я хочу про С++.

_>(руби и яваскрипт я всё равно не знаю)

Да там одного дефайна хватит.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[7]: wat
От: anonymous Россия http://denis.ibaev.name/
Дата: 12.03.13 10:13
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>В С++ большая часть вещей вполне логична, если понимать причины, по которым оно так получилось. Оно всё переусложнено, но логично.


В JS то же самое.

C>А вот в JS нет никакой логики.


Это от незнания.
Re[11]: wat
От: Eugeny__ Украина  
Дата: 12.03.13 16:00
Оценка:
Здравствуйте, dimgel, Вы писали:


D>Это также ИМХО не катит: на java/scala я могу написать точно такой же левый каст, они от этого не станут слабыми. А то, что этот каст вылетит (точнее, может вылететь) в рантайме — дык это уже динамика, а не статика. А я спрашиваю про слабую статику. Техническая возможность беспредельничать разнообразными способами, форсированно обходя контроль системы типов, не означает отсутствие этого контроля. Грубо говоря, если я получу адрес объекта и тупо забью его мусором через memset(), это как бы к системе типов отношения не имеет.


Не всегда. Часто компилятор ругается, что такой каст никогда не прокатит. Пример:
        String s = "";
        int a = (int)(Object) s;


inconvertible types
found : java.lang.Object
required: int

Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[12]: wat
От: dimgel Россия https://github.com/dimgel
Дата: 12.03.13 16:09
Оценка:
Здравствуйте, Eugeny__, Вы писали:

E__>Не всегда. Часто компилятор ругается, что такой каст никогда не прокатит. Пример:

E__>
E__>        String s = "";
E__>        int a = (int)(Object) s;
E__>


E__>

E__>inconvertible types
E__>found : java.lang.Object
E__>required: int


Хм. Первая мысль была — не путаешь ли ты время компиляции со временем выполнения, но не похоже: во время выполнения ClassCastException вылетает. Возможно в данном случае фокус в том, что ты пытаешься привести объект к примитиву. Скале в этом случае пофиг, у неё есть Any, который обрабатывается в общем порядке, и автоматический boxing/unboxing:

scala> def f(s: String) = s.asInstanceOf[Object].asInstanceOf[Int]
f: (s: String)Int

scala>  "".asInstanceOf[Object].asInstanceOf[Int]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.