当前位置: 首页 > 面试题库 >

Java泛型-获取属性名称和实际类型的映射[重复]

戎志勇
2023-03-14
问题内容

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

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

问题答案:

从我的头上,未经验证

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


 类似资料:
  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 我有一个像这样的课程: 但是编译器说:。 我如何获得的课程? 问题答案: 绝对有可能将其提取出来,因为它不是在运行时定义的,而是在编译时由定义的。 这是一个启动示例,您可以如何在抽象类的构造函数中提取所需的泛型超类型,同时考虑子类的层次结构(以及在无需显式提供类型的情况下将其应用于泛型方法的实际用例)):

  • 问题内容: 我有一个列表,程序是这样的:。有什么方法可以使用T变量获取类的名称(因此我可以从内部知道T是否为String,Socket等)? 编辑:没关系,在这里找到了答案。 问题答案: 简短答案 :您不能。 长答案 : 由于使用Java实现泛型的方式,泛型T在运行时不会保留。您仍然可以使用私有数据成员: 用法示例:

  • 问题内容: 我在使用泛型时遇到麻烦。给出以下示例: 什么 ???应该 ? 不工作… 也不。 不工作… 如果有Java泛型专家,我需要帮助…:/ 问题答案: 由于类型擦除,您可能无法获得除外。你将不得不使用不安全的类型转换投下的-具体而言,将做的工作。

  • 问题内容: 我有一个类型T的泛型类,我想获得实例化时传递给该类的类型的名称。这是一个例子。 我已经逛了好几个小时,但似乎找不到任何方法。有人尝试过吗? 任何帮助是极大的赞赏。 谢谢 问题答案: 单纯的快速方法是不可能的。 可能的解决方法是: 这些限制取决于它仅适用于类的事实。 如果这是通用类型: 返回全名(包括名称空间): 这就是为什么func搜索字符的最后一次出现。 测试如下: 更新Swift

  • 问题内容: 在我的项目中,我使用Entity Framework6。我有以下实体: 和 当我插入一个填充了PersonRights的人员对象时,它在数据库中看起来像这样: 人员实体表: PersonRights实体表 当我从数据库加载人时,它没有填充PersonRights属性,这是因为virtual关键字具有延迟加载功能-可以。 然后我得到了person对象的PersonRights,它也可以正