Могу ли я сделать типобезопасное умножение с java JSR-363 "Единицы измерения"

Я использую javax.measure (JSR-363) с реализацией tec.uom.se ( https://github.com/unitsofmeasurement/uom-se):

    import javax.measure.Quantity;
    import javax.measure.Unit;
    import javax.measure.quantity.Area;
    import javax.measure.quantity.Length;
    import javax.measure.quantity.Time;
    import tec.uom.se.quantity.Quantities;
    import static tec.uom.se.unit.Units.METRE;
    import static tec.uom.se.unit.Units.SECOND;

Я пытаюсь понять, как правильно делить / умножать. Кажется, это работает нормально, как показано ниже:

    Quantity<Length> width = Quantities.getQuantity(1.0, METRE);
    Quantity<Length> height = Quantities.getQuantity(1.0, METRE);

    // 1. type unsafe (but legal), yielding m² 
    Quantity<Area> area = (Quantity<Area>) width.multiply(height); 

    // 2. type unsafe (and semantically ILLEGAL)
    Quantity<Time> illegalConverted = (Quantity<Time>) width.multiply(height); 

    // 3. RuntimeException discoverying illegal step 2: "m² is not compatible with s"
    Quantity<Time> illegalConvertedSecond = illegalConverted.to(SECOND);

Как мы видим, после умножения механизму java generics требуется явное приведение. Это просто ограничение системы типов, и я правильно здесь что-то делаю? Я могу предположить, что, поскольку единица изменяется, система типов не может приспособиться к этому; и что в Java есть стирание типов, поэтому во время выполнения это не замечается до следующего шага 3.

Или я должен умножить по-другому, чтобы лучше использовать возможности библиотеки?

0 ответов

Другие вопросы по тегам