[英]Using class object as generic type
我不完全确定如何提出这个问题,这也是为什么我不确定标题等等。 开始。
假设你有一个对象Foo foo = new Foo()
。 是否有可能编写类似new ArrayList<foo.getClass()>()
,它在运行时会等同于new ArrayList<Foo>()
?
另一个但相关的问题是:假设类Foo
扩展了Exception
。 那么可以写出类似的东西吗?
try{
// ...
} catch(foo.getClass() e) {
//
}
这将转化为
try{
// ...
} catch(Foo e) {
//
}
?
这样做是否可怕,并不是重要的部分。 但是,无论如何,我想听听合格的意见。
不,这在Java语言规范中是不可能的。 通用参数纯粹是编译时类型安全机制,因此在运行时定义它们是非感性的。
代码中的类文字与Class<T>
对象不可互换,因为它们本身具有不同的角色。 后者仅在运行时具有意义,并且可以动态变化。
类型与其类文字之间存在微妙但存在的差异。
类文字是对类型进行建模的对象。 除其他外,它提供了有关类型实现的详细信息。
引用对象时使用类型。 通用参数也是如此。 它们在源代码中用类型表示。
例如,在写作的同时
String foo = "foo";
是合法的
"".getClass() foo = "foo"
不是。
我希望这是有道理的。
编辑:使用Generics时,通常的模式是将Class作为参数传递。
<T> doSomething(Class<T> clazz);
Edit2:根据@millimoose评论编辑
Java不支持该语法,但如果您的目标是创建一个类型由实例类型决定的Collection,则创建一个类型化方法 ,例如:
public static <T> List<T> createList(T object) {
List<T> list = new ArrayList<T>();
list.add(object);
return list;
}
传入的任何类型都将确定返回的List的类型。 这不是运行时决定 - 它是一个编译时间检查,但它与我如何解释你的意图最接近。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.