gpt4 book ai didi

java - Guava 的 TypeToken 能否获取泛型字段的具体类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:10:21 28 4
gpt4 key购买 nike

我为一种名为 ASN.1 的文件格式编写了一个解析器,它使用 Guice 的 TypeLiteral.getFieldType(Field)将通用字段转换为特定的 Java 类型,以便我可以构造正确的类型(类似于 Jackson 或 GS​​ON 数据绑定(bind))。但是因为我已经依赖 Guava 并且它似乎有一个新的 TypeLiteral 替代品,所以我想使用 TypeToken反而。根据Guave TypeToken documentation :

TypeToken is similar to Guice's TypeLiteral class, but with one important difference: it supports non-reified types such as T, List<T> or even List<? extends Number>; while TypeLiteral does not. TypeToken is also serializable and offers numerous additional utility methods.

你能用TypeToken得到字段的具体类型吗? ?换句话说,我如何在 Guava 中执行以下操作?

import org.junit.Test;
import com.google.inject.TypeLiteral;
public class FieldTypeTest {
public static class A<T> {
T a;
}
public static class B {
A<String> b;
}

@Test
public void testTypeToken() throws SecurityException, NoSuchFieldException {
TypeLiteral<?> reifiedA = TypeLiteral.get(B.class).getFieldType(B.class.getDeclaredField("b"));
assertEquals(String.class, reifiedA.getFieldType(reifiedA.getRawType().getDeclaredField("a")).getRawType());
}
}

最佳答案

我的想法,未经验证

Type t = B.class.getDeclaredField("b").getGenericType();
Class<?> p = TypeToken.of(t).resolve(
/* T */ A.getTypeParameters()[0]).getRawType();
// p should be String.class

关于java - Guava 的 TypeToken 能否获取泛型字段的具体类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13464975/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com