标签: jsr363

JSR 363添加新单位

我正在使用来自maven(tec.units:unit-ri)的JSR 363:Measurement of Measurement API的参考实现.

现在我必须添加一些单位,如茶匙,液体盎司等.

我扩展Units类来添加一个像这样的新单元:

public static final Unit<Volume> TEASPOON = addUnit(new TransformedUnit<Volume>("tsp", CUBIC_METRE, new MultiplyConverter(0.000005)));
Run Code Online (Sandbox Code Playgroud)

这似乎适用于转换,但"tsp"不解析,所以如何将其添加到解析器?

我在添加华氏温度时遇到了麻烦:T(°F)= T(K)×9/5 - 459.67

如何使用转换器执行此操作,还是必须扩展UnitConverter并创建自己的转换器?

java units-of-measurement jsr363

7
推荐指数
1
解决办法
924
查看次数

Jackson模块签名可防止为自引用泛型类型添加序列化程序

我想为JSR 363添加一个自定义序列化器和反序列化器javax.measure.Quantity<Q extends Quantity<Q>>,它基本上封装了一个"值"和一个"单元".创建序列化程序(extends JsonSerializer<Quantity<?>>)和反序列化程序(extends StdDeserializer<Quantity<?>>)很容易.

但注册它们并不容易.对于反序列化器,它没关系; 看看签名:

SimpleModule.addDeserializer(Class<T> type, JsonDeserializer<? extends T> deser)
Run Code Online (Sandbox Code Playgroud)

请注意,反序列化器允许扩展泛型类型.所以我可以这样做:

module.addDeserializer(Quantity.class, new MyQuantityJsonDeserializer());
Run Code Online (Sandbox Code Playgroud)

但序列化器是另一个故事; 看看它的注册签名:

SimpleModule.addSerializer(Class<? extends T> type, JsonSerializer<T> ser)
Run Code Online (Sandbox Code Playgroud)

哦,由于受限的泛型类型导致的痛苦.我不能做到这一点:

module.addSerializer(Quantity.class, new MyQuantityJsonSerializer());
Run Code Online (Sandbox Code Playgroud)

这是因为Quantity.class永远不会给我一个Class<Quantity<Q extends Quantity<Q>>.并且没有简单的演员,没有在模块方法中引入一些任意的泛型变量并使用杂技演员.即使这样也行不通:

module.addSerializer((Class<Quantity<?>>) Quantity.class, new MyQuantityJsonSerializer());
Run Code Online (Sandbox Code Playgroud)

我能做的最好的事情是创建我的序列化程序类QuantityJsonSerializer<Q extends Quantity<Q>> extends JsonSerializer<Q>,然后在模块中将其注册为原始类型:

@SuppressWarnings({"rawtypes", "unchecked"})
final JsonSerializer<Quantity> quantitySerializer =
    (JsonSerializer<Quantity>) new MyQuantityJsonSerializer();
module.addSerializer(Quantity.class, quantitySerializer);
Run Code Online (Sandbox Code Playgroud)

呃,那有多难看?但这是我能找到的唯一能让它上班的方法之一,我不得不通过更多的体操来消除警告.

肯定SimpleModule.addSerializer()可以在其通用参数上更灵活,类似于SimpleModule.addDeserializer()

我在这里报道这是因为杰克逊项目在这里报告错误 - 我也要求更好的解决方法.谢谢.

java generics jackson jsr363

7
推荐指数
1
解决办法
424
查看次数

Java单位的测量库加法和减法返回不正确的值

我正在使用JSR363的参考实现.我尝试了很多这方面的变化,但我会以此代码为例.

ServiceProvider provider = ServiceProvider.current();
QuantityFactory<Length> lengthFactory = provider.getQuantityFactory(Length.class);
Quantity<Length> first = lengthFactory.create(5, Units.METRE.divide(100.0));
Quantity<Length> second = lengthFactory.create(3, Units.METRE);
System.out.println(second.add(first));
Run Code Online (Sandbox Code Playgroud)

这打印503.0米.显然有些东西是非常错误的,这应该是3.05米.我发现很难相信这实际上是图书馆的一个错误,我希望有人可以告诉我我错过了什么.

java jscience jsr363

6
推荐指数
1
解决办法
602
查看次数

如何使用 Java 测量 API 更改单元上的标签?

问题介绍

我正在尝试使用Java Units of Measurement (JSR 363) 的这种实现

我想改变几个提供的单位的行为。一个例子是DEGREE_ANGLE,因此度数符号 (°) 被附加到任何被toString'd 的Quantity 的末尾。就像现在一样,数量将打印6.1345983929 [rad?]

解决方案的尝试

我已经尝试了很多不同的方法来实现这一点,但似乎在其他示例中存在的一种方法AbstractSystemsOfUnits (例如来自统一度量单位实现)是使用静态块,如下所示:

// //////////////////////////////////////////////////////////////////////////
// Label adjustments for UCUM system
static {
    SimpleUnitFormat.getInstance().label(ATOMIC_MASS_UNIT, "AMU");
    SimpleUnitFormat.getInstance().label(LITER, "l");
    SimpleUnitFormat.getInstance().label(OUNCE, "oz");      
    SimpleUnitFormat.getInstance().label(POUND, "lb");
}
Run Code Online (Sandbox Code Playgroud)

我试图通过扩展我正在使用的实现Units类来适应这个解决方案。

public final class MyUnits extends Units {
    static {
        SimpleUnitFormat.getInstance().label(DEGREE_ANGLE, "°");
    }
}
Run Code Online (Sandbox Code Playgroud)

以及尝试使用此扩展程序的简单测试:

Quantities.getQuantity(2.009880307999, MyUnits.RADIAN).to(MyUnits.DEGREE_ANGLE).toString();
Run Code Online (Sandbox Code Playgroud)

给我 115.157658975 [rad?]

如何使用 JSR 363 API 更改单元上的标签?

java units-of-measurement jsr363

5
推荐指数
1
解决办法
517
查看次数