使用类对象作为泛型类型

时间:2013-10-17 07:25:38

标签: java exception generics exception-handling

我不完全确定如何提出这个问题,这也是我不确定标题等的原因。到此为止。

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

另一个但相关的问题是:假设课程Foo延伸Exception。那么可以编写像

这样的东西
try{
    // ...
} catch(foo.getClass() e) {
    //
}

将转化为

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

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

3 个答案:

答案 0 :(得分:6)

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

代码中的类文字与Class<T>个对象不可互换,因为它们本身具有不同的角色。后者仅在运行时具有意义,并且可以动态变化。

答案 1 :(得分:0)

类型及其类文字之间存在微妙但存在的差异。

类文字是对类型进行建模的对象。除此之外,它还提供了有关类型实现的详细信息。

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

例如,在写作时

String foo = "foo";

是合法的

"".getClass() foo = "foo"

不是。

我希望这是有道理的。

编辑:使用Generics时,通常的模式是将Class作为参数传递。

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

Edit2:根据@millimoose评论编辑

答案 2 :(得分:0)

Java不支持该语法,但如果您的目标是创建一个类型由实例类型决定的Collection,请创建一个类型的方法,例如:

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

您传入的任何类型都将确定返回的List的类型。这不是运行时决定 - 它是一个编译时检查,但它与我如何解释你的意图最接近。