4

我不完全确定如何问这个问题,这也是我不确定标题等的原因。开始。

假设你有一个对象Foo foo = new Foo()。是否可以编写类似的代码new ArrayList<foo.getClass()>(),在运行时相当于new ArrayList<Foo>()

另一个但相关的问题是:假设类Fooextends Exception。那么是否可以写类似的东西

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

这将转化为

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

?

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

4

3 回答 3

7

不,这在 Java 语言规范中是不可能的。泛型参数纯粹是一种编译时类型安全机制,因此在运行时定义它们是没有意义的。

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

于 2013-10-17T07:28:45.153 回答
0

类型与其 Class 字面量之间存在细微但存在的差异。

类文字是对类型建模的对象。除其他外,它还提供有关类型实现的详细信息。

当您引用一个对象时,您使用一种类型。泛型参数也是如此。它们在源代码上用类型表示。

例如,在写作时

String foo = "foo";

是合法的

"".getClass() foo = "foo"

不是。

我希望这是有道理的。

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

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

Edit2:根据@millimoose 评论编辑

于 2013-10-17T07:35:52.017 回答
0

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

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

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

于 2013-10-17T10:49:46.787 回答