Size: a a a

2019 September 07

Ж

Женя in KotlinLangRu
окей
источник

Ж

Женя in KotlinLangRu
всем спасибо
источник

Ж

Женя in KotlinLangRu
К слову вопрос для опытных. Котлин вообще норм язык ? 🤔
источник

M

Malik in KotlinLangRu
Женя
К слову вопрос для опытных. Котлин вообще норм язык ? 🤔
Прекрасный
источник

F

François Leclercq in KotlinLangRu
Malik
Прекрасный
/*00*/ class C<T>(val value : Any) { /*01*/ fun F() : T { /*02*/ try { /*03*/ val v = value as T //Предупреждение компилятора "Unchecked cast: Any to T" /*04*/ return v /*05*/ } catch(ex : RuntimeException) { /*06*/ println("Incompatible") /*07*/ // Хак для иллюстрации того, что эксепшин будет съеден и не пойдет дальше /*08*/ return 0 as T /*09*/ } /*10*/ } /*11*/ } /*12*/ /*13*/ fun fTest() { /*14*/ val a = C<Int>( 12.789 ) /*15*/ println( "rc: ${a.F()}" ) /*16*/ /*17*/ val b = C<Int>( "12.123" ) /*18*/ println( "rc: ${b.F()}" ) /*19*/ }
источник

F

François Leclercq in KotlinLangRu
Сорян за форматирование (точнее его отсутствие), с телефона не хотит форматироваться из буфера
источник
2019 September 08

S

ShadelessFox in KotlinLangRu
François Leclercq
/*00*/ class C<T>(val value : Any) { /*01*/ fun F() : T { /*02*/ try { /*03*/ val v = value as T //Предупреждение компилятора "Unchecked cast: Any to T" /*04*/ return v /*05*/ } catch(ex : RuntimeException) { /*06*/ println("Incompatible") /*07*/ // Хак для иллюстрации того, что эксепшин будет съеден и не пойдет дальше /*08*/ return 0 as T /*09*/ } /*10*/ } /*11*/ } /*12*/ /*13*/ fun fTest() { /*14*/ val a = C<Int>( 12.789 ) /*15*/ println( "rc: ${a.F()}" ) /*16*/ /*17*/ val b = C<Int>( "12.123" ) /*18*/ println( "rc: ${b.F()}" ) /*19*/ }
А можно поинтересоваться, в чём здесь именно проблема, не позволяющая котлину быть прекрасным? То, что дабл магическим образом становится числом?
источник

S

ShadelessFox in KotlinLangRu
Если посмотреть байткод, то всё встанет на свои места:

class Storage<T>(val value: Any) {
   @Suppress("UNCHECKED_CAST")
   fun get(): T {
       return value as T
   }
}

fun main() {
   println(Storage<Int>(123.456).get())
   println(Storage<Int>("123.456").get())
   println(123.456 as Int)
}

И чуть-чуть очищенный декомпилированный код:

public static void main() {
   System.out.println(((Number)(new Storage(123.456D)).get()).intValue());
   System.out.println(((Number)(new Storage("123.456")).get()).intValue());
   System.out.println((Integer)123.456D);
}

Котлин понимает, что value является субклассом числа, кастит к нему, а после вызывает метод intValue
Но в то же время это не происходит при явном касте без использования дженериков, в итоге as разворачивается в каст примитива в объект-обёртку

Окей, это немного странно
источник

S

ShadelessFox in KotlinLangRu
Вообще, эти приколы появляются из-за autoboxing, что тянется ещё из джавы. Увы, нормальные дженерики не завезли, но вы держитесь, всего хорошего.
источник

F

François Leclercq in KotlinLangRu
ShadelessFox
А можно поинтересоваться, в чём здесь именно проблема, не позволяющая котлину быть прекрасным? То, что дабл магическим образом становится числом?
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number
источник

S

ShadelessFox in KotlinLangRu
И?
источник

S

ShadelessFox in KotlinLangRu
Строка — не число.
источник

F

François Leclercq in KotlinLangRu
ShadelessFox
Вообще, эти приколы появляются из-за autoboxing, что тянется ещё из джавы. Увы, нормальные дженерики не завезли, но вы держитесь, всего хорошего.
Указывать на недостатки жабы с учётом того что Котлин позиционируется как другой язык...
источник

S

ShadelessFox in KotlinLangRu
Использовать только бекенд JVM и говорить про то, что котлин позиционирует себя как другой язык, натыкаясь на его ошибки и распространяя их на весь язык. Вот и используйте другие бекенды, а не орите на недостатки этого, лол.
источник

F

François Leclercq in KotlinLangRu
Это понятно, но в таком случае прекрасность  котлина напрямую зависит от жабы. Та же нулл безопасность по сути попытка контролировать то что котлину неподвластно
источник

S

ShadelessFox in KotlinLangRu
Это попытка программистов ограничить от популяризации нулла везде. Нулл вреден и не нужен.
источник

S

ShadelessFox in KotlinLangRu
И без котлина можно писать код без него.
источник

S

ShadelessFox in KotlinLangRu
François Leclercq
Это понятно, но в таком случае прекрасность  котлина напрямую зависит от жабы. Та же нулл безопасность по сути попытка контролировать то что котлину неподвластно
Я ещё раз повторяю, потому что такой бекенд. Это не жс, где из объекта можно сделать число, а из строки массив. Там вообще приведение типов не нужно.
источник

F

François Leclercq in KotlinLangRu
ShadelessFox
Это попытка программистов ограничить от популяризации нулла везде. Нулл вреден и не нужен.
Тогда нужно программно запретить использовать жабокод, в т.ч. и ст библиотеки
источник

S

ShadelessFox in KotlinLangRu
И смысл тогда вообще позиционировать приложения под этот бекенд?
источник