Преобразование из скорости в (скорость) ^ - 1 - PullRequest
2 голосов
/ 13 апреля 2019

Используя библиотеку 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)

Полагаю, мне нужно создать свой собственный Type, но я не выяснил, как.

Может кто-нибудь привести пример, пожалуйста?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

В конце концов я обнаружил, что существует функция .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 голос
/ 13 апреля 2019

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

public interface InverseSpeed extends Quantity<InverseSpeed> {}

А затем создайте такой юнит:

Unit<InverseSpeed> MINUTE_BY_KILOMETERS = 
    Units.MINUTE.divide(MetricPrefix.KILO(Units.METRE)).asType(InverseSpeed.class);
...