【问题标题】:Java Generics & ReflectionJava 泛型与反射
【发布时间】:2011-04-22 13:47:45
【问题描述】:

这可能是一个基本问题,但我可以这样做:

Class myClass = Class.forName("Integer");
SomethingSimple<myClass> obj;

SomethingSimple 是一个非常简单的泛型类:

class SomethingSimple<T>
{
    T value;
    SomethingSimple() {}
    public void setT(T val)
    {
        value = val;
    }
    public T getT()
    {
        return value;
    }
}

显然,上面的代码是不正确的,因为 myClass 是 Class 类型的对象,并且需要一个类。问题是如何做到这一点。我阅读了有关泛型反射的其他主题,但它们关注泛型类如何知道类型。

【问题讨论】:

标签: java generics reflection


【解决方案1】:

不,你不能那样做。重点是什么?泛型为您提供编译时类型检查,如果直到运行时才知道该类,您将一无所获。

【讨论】:

    【解决方案2】:

    Java 中的泛型仅用于编译时的静态类型检查;通用信息在类型检查后被丢弃(阅读type erasure),因此SomethingSimple&lt;Foo&gt; 在运行时实际上只是SomethingSimple&lt;Object&gt;

    当然,您不能对直到运行时才知道的类型进行完整的类型检查。编译器必须知道类型,这就是为什么必须使用实际类型名称而不是 Class 变量作为泛型类型参数的原因。

    【讨论】:

      【解决方案3】:

      泛型是一种确保类型安全的编译时机制,而反射是一种运行时机制。您要说的是,“我在编译时不知道 T 的类型是什么,但我想要编译时类型安全”(这没有多大意义)。换句话说,java 在运行时会删除 T 的类型并将其存储为 Object...所以 T 的类型(就泛型而言)不再重要。

      但实际上,您似乎想要一个依赖注入容器,例如 spring 或 google guise。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      相关资源
      最近更新 更多