我不完全确定如何提出这个问题,这也是我不确定标题等的原因。到此为止。
假设您有一个对象Foo foo = new Foo()
。是否可以编写像new ArrayList<foo.getClass()>()
这样的代码,它在运行时会等同于new ArrayList<Foo>()
?
另一个但相关的问题是:假设课程Foo
延伸Exception
。那么可以编写像
try{
// ...
} catch(foo.getClass() e) {
//
}
将转化为
try{
// ...
} catch(Foo e) {
//
}
这是否可怕,不是重要的部分。但是,无论如何,我想听听合格的意见。
答案 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的类型。这不是运行时决定 - 它是一个编译时检查,但它与我如何解释你的意图最接近。