2013-10-17 68 views
4

我不完全确定如何提出这个问题,这也是为什么我不确定标题等等。开始。使用类对象作为泛型

假设你有一个对象Foo foo = new Foo()。是否有可能编写像new ArrayList<foo.getClass()>()这样的代码,在运行时会等于new ArrayList<Foo>()

另一个,但相关的问题是:假设类Foo延伸Exception。它是那么可能写出像

try{ 
    // ... 
} catch(foo.getClass() e) { 
    // 
} 

这将转化为

try{ 
    // ... 
} catch(Foo e) { 
    // 
} 

这是否是可怕的事情不是重要的一部分。但是,无论如何,我想听听有资格的意见。

+0

运行时的泛型,我们经常在这里得到:)在运行时'ArrayList '只是成为'ArrayList'。擦除发生。只是为了讨厌 - 这可能在C#中。 –

+1

@BenjaminGruenbaum不,它不是。 C#的泛型仍然*主要是*编译时类型 - 安全特性(除了有意义地执行'typeof(T)'的能力,即你得到一个免费传递的类型标记),因此对于你使用反射的类型。 – millimoose

回答

6

不,这在Java语言规范中是不可能的。通用参数纯粹是一种编译时类型 - 安全机制,因此在运行时定义它们是非感性的。

由于其固有的不同角色,代码中的类文字不能与Class<T>对象互换。后者仅在运行时有意义,并且可以动态变化。

0

类型和它的类文字之间存在细微的但是存在的差异。

类文字是一个模型类型的对象。除此之外,它提供了有关该类型实现的详细信息。

当你引用一个对象时,你使用了一个类型。通用参数也是如此。它们在源代码中用类型表示。

例如,一边写

String foo = "foo"; 

是合法

"".getClass() foo = "foo" 

不是。

我希望这是有道理的。

编辑:当使用泛型时,通常的模式是将类作为参数传递。

<T> doSomething(Class<T> clazz); 

EDIT2:根据@millimoose评论

编辑
+1

这是一个令人困惑的答案,因为'Type'是一个JDK类,实际上它的含义与您所描述的不同。另外,你提到的模式很有用,但对OP来说没用。 – millimoose

+0

@millimoose你是对的,我应该没有使用大写字母T。我做了一些编辑。 – dkateros

0

Java不支持这种语法,但如果你的目标是创建一个集合,其类型由一个实例的类型确定,创建一个类型化的方法,如:

public static <T> List<T> createList(T object) { 
    List<T> list = new ArrayList<T>(); 
    list.add(object); 
    return list; 
} 

任何类型的传递将确定名单的类型返回。这不是一个运行时确定 - 这是一次编译时间检查,但它与我解释你的意图最接近。