Используя библиотеку javax.measure, я пытаюсь преобразовать км / ч в мин / км.

Однако мин / км не является частью единиц, предложенных unit-ri.

Поэтому я попытался создать свой собственный блок: MINUTE_BY_KILOMETERS

import javax.measure.Quantity;
import javax.measure.Unit;
import javax.measure.quantity.Length;
import javax.measure.quantity.Speed;

import tec.units.ri.quantity.Quantities;
import tec.units.ri.unit.MetricPrefix;
import tec.units.ri.unit.Units;
    Quantity<Speed> speed = Quantities.getQuantity(10, Units.KILOMETRE_PER_HOUR);
    assertEquals("10 km/h", speed.toString());

    // Conversion m/s
    assertEquals("2.7777800000000004 m/s", speed.to(Units.METRE_PER_SECOND).toString());

    // Conversion min/km
    Unit<Speed> MINUTE_BY_KILOMETERS = Units.MINUTE.divide(MetricPrefix.KILO(Units.METRE)).asType(Speed.class);
    assertEquals("6 min/km", speed.to(MINUTE_BY_KILOMETERS).toString());

Но у меня есть исключение:

java.lang.ClassCastException: The unit: min/km is not compatible with quantities of type interface javax.measure.quantity.Speed
    at tec.units.ri.AbstractUnit.asType(AbstractUnit.java:274)

Я предполагаю, что должен создать свой собственный Тип, но я не узнал как.

Кто-нибудь может привести пример?

2
user1864070 13 Апр 2019 в 12:37

2 ответа

Лучший ответ

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

Таким образом, вы должны сохранять метрики (расстояние / время) в коде, чтобы выполнять все операции и преобразования, и добавлять .inverse () в конце, когда вам нужно ваше значение:

Unit<Speed> KILOMETERS_BY_MINUTES = MetricPrefix.KILO(Units.METRE).divide(Units.MINUTE).asType(Speed.class);
assertEquals("5.9999952000038395 min/km", speed.to(KILOMETERS_BY_MINUTES).inverse().toString());
1
user1864070 15 Апр 2019 в 08:45

Скорость определяется как расстояние, деленное на время, поэтому вы не можете создать Speed единицу «минут на километр». Однако вы можете создать собственное измерение обратной скорости, которое является не чем иным, как интерфейсом маркера:

public interface InverseSpeed extends Quantity<InverseSpeed> {}

А затем создайте такой блок:

Unit<InverseSpeed> MINUTE_BY_KILOMETERS = 
    Units.MINUTE.divide(MetricPrefix.KILO(Units.METRE)).asType(InverseSpeed.class);
1
Mureinik 13 Апр 2019 в 10:28