Из документов Dart:
Надежность заключается в обеспечении того, чтобы ваша программа не могла попасть в определенные недопустимые состояния. Система звукового типа означает, что вы никогда не сможете попасть в состояние, когда выражение вычисляется до значения, которое не соответствует статическому типу выражения. Например, если статический тип выражения равен Строка
, во время выполнения вы гарантированно получите строку только тогда, когда вы ее оцените.
Система типов Dart, как и системы типов в Java и C#, является надежной. Он обеспечивает эту надежность, используя комбинацию статической проверки (ошибки во время компиляции) и проверок во время выполнения. Например, присвоение строки
|/int является ошибкой во время компиляции. Приведение
объекта к строке с использованием
как строки завершается ошибкой во время выполнения, если объект не является строкой.
Это интересная точка зрения – да, система типов надежна (на основе предоставленного определения), но в то же время это означает, что приложение может выйти из строя из-за ошибки типа 🤔 .
Например, если бы я написал:
public class HelloWorld{ public static void main(String []args){ String[] strs = { 1 }; } }
Он не будет компилироваться:
$javac HelloWorld.java HelloWorld.java:4: error: incompatible types: int cannot be converted to String String[] strs = { 1 }; ^ 1 error
Но это скомпилирует:
public class HelloWorld{ public static void main(String []args){ String[] strs = { "1" }; Object[] objs = strs; objs[0] = 1; String one = strs[0]; System.out.println("Hello World"); } }
и потерпеть неудачу:
$javac HelloWorld.java $java -Xmx128M -Xms16M HelloWorld Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer at HelloWorld.main(HelloWorld.java:6)
Я чувствую, что здесь что-то не так.
Можем ли мы сказать, что система типов является надежной, а статический анализатор – нет?
Или наоборот – если мы можем сказать, что для создания системы звуковых типов достаточно полагаться на динамические проверки типов, можем ли мы сказать, что Ruby – это звук?
1 + "0" // TypeError: String can't be coerce into Numeric
Смотри также: Java не работает: Перспектива Отрасли
Оригинал: “https://dev.to/stereobooster/are-dart-and-java-type-systems-sound-3568”