Guava的TypeToken可以获得通用字段的特定类型吗?

yon*_*ran 6 java guava

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

TypeToken类似于Guice的TypeLiteral类,但有一个重要的区别:它支持非实现类型,如T,List<T>甚至List<? extends Number>; 而TypeLiteral不是.TypeToken也是可序列化的,并提供了许多额外的实用方法.

你能用一个字段的具体类型TypeToken吗?换句话说,我怎样才能在番石榴中做到以下几点?

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

Pio*_*sen 7

从我的头,未经核实

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

  • 谢谢,getGenericType()和resolve()是我需要的.TypeToken <?> reifiedA = TypeToken.of(B.class).resolveType(B.class.getDeclaredField("b").getGenericType()); assertEquals(String.class,reifiedA.resolveType(reifiedA.getRawType().getDeclaredField("a").getGenericType()).getRawType()); (2认同)