1

我正在寻找一种更好的使用 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>)
4

2 回答 2

2

工厂方法在某些情况下Unit.valueOf("kg")可能很方便。但在这种情况下,它没有保留足够的信息。它只返回“一些”数量的单位 - 因此? extends Quantity在返回类型中。但是你不知道这是数量是,例如,Mass还是Power。只要你不知道这一点,你就不能说调用quantity.to(unitQuantity.getUnit())是否有效。

在这种情况下,您可以使用 anew 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);
    }
}
于 2014-04-07T17:38:01.797 回答
0

找到了两种方法。转换失败时抛出 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());
}
于 2014-10-12T11:19:27.440 回答