Здравствуйте, 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-фича, неотъемлемое свойство таких кастов: либо они позволяют обманывать компилятор, либо их нет в языке вообще.
Здравствуйте, antonio_banderas, Вы писали:
_>Здравствуйте, Mamut, Вы писали:
M>>Люди саркастически издеваются над нашими любимыми языками программирования:
M>>https://www.destroyallsoftware.com/talks/wat
_>Я хочу про С++.
_>(руби и яваскрипт я всё равно не знаю)
Да там одного дефайна хватит.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, 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.
Здравствуйте, 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