Использование Jscience для расчета цены за n единиц с учетом цены за единицу и количества

Я ищу лучший способ вычислений с использованием Jscience, но общий шаблон намного сложнее, чтобы получить четкое решение. Мне нужно вычислить цену за n единиц, если определена цена за единицу количества. нравится,

    Measure<Double, ? extends Quantity> unitQuantity = Measure.valueOf(1.0,
            Unit.valueOf("kg"));
    Amount<Money> unitPrice = Amount.valueOf(150.0, USD);
    Measure<Double, ? extends Quantity> quantity = Measure.valueOf(500.0,
            MILLI(Unit.valueOf("kg")));
    Amount<Money> amount = unitPrice.times(quantity.to(unitQuantity.getUnit())
                       .getValue() / unitQuantity.getValue());

Для приведенного выше кода я получаю эту ошибку:

The method to(Unit<capture#7-of ? extends Quantity>) in the type 
Measure<Double,capture#7-of ? extends Quantity> is not applicable for 
the arguments (Unit<capture#8-of ? extends Quantity>)

Я читал об дженериках в учебниках по Java и пробовал следующее, но до сих пор нет четкого решения:

    Amount<Money> amount = compute(unitPrice,unitQuantity,quantity)

    private <T extends Quantity> Amount<Money> compute(Amount<Money> unitPrice,
        Measure<Double, T> unitQuantity, Measure<Double, T> quantity) {
    return unitPrice.times(quantity.to(unitQuantity.getUnit()).getValue()
            / unitQuantity.getValue());
}

Теперь получаю эту ошибку:

   The method compute(Amount<Money>, Measure<Double,T>, Measure<Double,T>) 
   in the type JscienceEx is not applicable for the arguments (Amount<Money>, 
   Measure<Double,capture#7-of ? extends Quantity>, Measure<Double,capture#8-of ?    
   extends Quantity>)

person Subhu.rys    schedule 07.04.2014    source источник


Ответы (2)


Фабричный метод Unit.valueOf("kg") может быть удобен в некоторых случаях. Но в этом случае он не сохраняет достаточно информации. Он возвращает только единицу «некоторого» количества — отсюда и ? extends Quantity в возвращаемом типе. Но вы не знаете, является ли это количеством, например, Mass или Power. И пока вы этого не знаете, вы не можете сказать, действителен ли вызов quantity.to(unitQuantity.getUnit()).

В этом случае вы можете решить эту проблему, используя new BaseUnit<Mass>("kg") вместо Unit.valueOf("kg"):

import static javax.measure.unit.SI.MILLI;

import javax.measure.Measure;
import javax.measure.quantity.Mass;
import javax.measure.unit.BaseUnit;

import org.jscience.economics.money.Currency;
import org.jscience.economics.money.Money;
import org.jscience.physics.amount.Amount;

public class JScienceUnits
{
    public static void main(String[] args)
    {
        BaseUnit<Mass> kg = new BaseUnit<Mass>("kg");
        Measure<Double, Mass> unitQuantity = Measure.valueOf(1.0, kg);
        Amount<Money> unitPrice = Amount.valueOf(150.0, Currency.USD);
        Measure<Double, Mass> quantity = Measure.valueOf(500.0, MILLI(kg));
        Amount<Money> amount = unitPrice.times(
            quantity.to(unitQuantity.getUnit()).getValue() / 
            unitQuantity.getValue());

        System.out.println(
            "Money for "+quantity+
            " with unit price "+unitPrice+
            " is "+amount);
    }
}
person Marco13    schedule 07.04.2014

Нашел два подхода. ConversionException выдается при сбое преобразования.

@SuppressWarnings("unchecked")
public static <U extends Quantity, V extends Quantity> Amount<Money> computeAmount(
        Measure<Double, U> unitQuantity, Amount<Money> unitRate,
        Measure<Double, V> netQuantity) {
    return unitRate.times(netQuantity.to((Unit<V>) unitQuantity.getUnit())
            .getValue() / unitQuantity.getValue());
}

-

public static <U extends Quantity, V extends Quantity> Amount<Money> computeAmount(
        Measure<Double, U> unitQuantity, Amount<Money> unitRate,
        Measure<Double, V> netQuantity) {
    UnitConverter toUnitQuantityUnit = netQuantity.getUnit()
            .getConverterTo(unitQuantity.getUnit());
    return unitRate
            .times(toUnitQuantityUnit.convert(netQuantity.getValue())
                    / unitQuantity.getValue());
}
person Subhu.rys    schedule 12.10.2014