Создание несовместимых числовых подтипов - PullRequest
0 голосов
/ 11 декабря 2018

В Аде можно создавать несовместимые эквивалентные числовые типы:

type Integer_1 is range 1 .. 10;
type Integer_2 is range 1 .. 10;
A : Integer_1 := 8;
B : Integer_2 := A; -- illegal!

Это предотвращает случайные логические ошибки, такие как добавление температуры к расстоянию.

Возможно ли это сделатьчто-то похожее в Java?Например,

class Temperature extends Double {}
class Distance extends Double {}
Temperature temp = 20.0;
Distance distance = temp; // Illegal!

РЕДАКТИРОВАТЬ

Я обнаружил несвязанный вопрос с соответствующим ответом .При этом используются аннотации и специальный процессор при компиляции для выдачи предупреждений, когда такие назначения происходят.Кажется, это самый безболезненный способ сделать это - нет необходимости в специальных классах со штрафами за разработку и выполнение, которые могли бы понести.

1 Ответ

0 голосов
/ 11 декабря 2018

Обертывание объектов не принято по той причине, которую вы указали в Java.Но это возможно.

Вместо использования extends Double (что не работает, потому что Double является окончательным).Вместо этого вы можете использовать делегирование.

public class Distance {
    private double distance;
    // constructor, getter, setter
}

public class Temperature {
    private double temp;
    // constructor, getter, setter
}

Тогда следующее сгенерирует ошибку во время компиляции.

Temperature temp = new Temperature(20.0);
Distance distance = temp; // Illegal!
...