【问题标题】:Define a generic type with a class object at runtime在运行时使用类对象定义泛型类型
【发布时间】:2012-10-08 08:48:18
【问题描述】:

是否可以使用类对象来声明泛型的类型?

例如,我想做这样的事情:

Class returnType = theMethod.getReturnType();

AttributeComponent<returnType> attComponent;

attComponent = new AttributeComponent<returnType>(returnType, attName);
attributeComponents.put(methodName.substring(3), attComponent);

现在我知道这显然是不正确的,但有没有办法做到这一点?

编辑:稍微解释一下

我使用反射来遍历所有 getter,然后为每个属性生成一个 UI 元素(AttributeComponent 类,它有一个 JComponent 元素和一个 JLabel)。我想使用泛型来创建一个 getValue() 方法,该方法将返回属性类型的对象。

【问题讨论】:

  • 你不能那样做。由于returnType 是变量,变量不能用作泛型参数。

标签: java generics reflection


【解决方案1】:

不知道有没有办法编译出这样的东西,但价值不大。

认为由于类型擦除,编译的类不使用泛型信息。也就是说,执行Set&lt;String&gt; a = new Set&lt;String&gt;(); 对于在编译时检查a 的使用很有用,但在运行时则不行。

因此,您想实例化一个仅在运行时知道其类型的 Generic,但在运行时不会使用它。

【讨论】:

    【解决方案2】:

    我想说这可以通过将方法返回类型定义为泛型来实现;但是您需要将实际类型作为类参数传递才能像您展示的那样使用它:

    <T> T yourMethod(Class<T> returnType) {
        // use <T> as generic and returnType to refer to the actual T class
        /* ... */ new AttributeComponent<T>(returnType, attName);
    }
    

    查看您正在尝试做的事情的更大背景也很有用。如果你想让AttributeComponent.getValue()返回一些泛型类型T(这是方法的返回类型),那是完全没用的,除非你在编译时知道每个方法的返回类型,否则T将只不过是一个Object .在我上面的示例中,您使用您已经知道的类调用 yourMethod,并且将返回相同的类型(或该类型的一些 AttributeComponent 或其他)。

    【讨论】:

    • 这如何解决我的问题?我正在尝试在运行时定义 AttributeComponent 泛型类型,如果这是可能的话(@Vash 已经声明它不是)。我编辑了原始帖子以获取有关我要实现的目标的更多信息)
    • 长话短说,您可以将类引用用作泛型类型。如果您在特定上下文中同时需要类 ref 和泛型,则需要将它们都传递给该方法,就像在我的示例 中一样,您需要不安全地进行操作(保留泛型并强制返回通过反射获得的类型到Class&lt;T&gt;)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多