【问题标题】:Can Guava’s TypeToken get the specific type of a generic field?Guava 的 TypeToken 可以获取泛型字段的具体类型吗?
【发布时间】:2012-11-20 17:04:34
【问题描述】:

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

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

你能用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());
    }
}

【问题讨论】:

    标签: java guava


    【解决方案1】:

    根据我的想法,未验证

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

    【讨论】:

    • 谢谢,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());
    • 这个答案值得+50!我找了 3 天,你救了我的命!
    • 我很高兴听到这个消息 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多