Могу ли я сделать типобезопасное умножение с 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.
Или я должен умножить по-другому, чтобы лучше использовать возможности библиотеки?