Java 使用类对象作为泛型类型
我不完全确定如何问这个问题,这也是为什么我不确定标题等等。来吧 假设您有一个对象Java 使用类对象作为泛型类型,java,exception,generics,exception-handling,Java,Exception,Generics,Exception Handling,我不完全确定如何问这个问题,这也是为什么我不确定标题等等。来吧 假设您有一个对象Foo-Foo=new-Foo()。是否可以编写类似于newarraylist()的代码,该代码在运行时相当于newarraylist() 另一个相关的问题是:假设类Foo扩展Exception。那么有没有可能写出这样的东西 try{ // ... } catch(foo.getClass() e) { // } 这将转化为 try{ // ... } catch(Foo e) {
Foo-Foo=new-Foo()
。是否可以编写类似于newarraylist()
的代码,该代码在运行时相当于newarraylist()
另一个相关的问题是:假设类Foo
扩展Exception
。那么有没有可能写出这样的东西
try{
// ...
} catch(foo.getClass() e) {
//
}
这将转化为
try{
// ...
} catch(Foo e) {
//
}
?
这样做是否可怕并不重要。但是,我还是希望听到有保留的意见。不,这在Java语言规范中是不可能的。泛型参数纯粹是一种编译时类型的安全机制,所以在运行时定义它们是没有意义的
代码中的类文字不能与
Class
对象互换,因为它们的角色本质不同。后者只有在运行时才有意义,并且可以动态变化。类型与其类文本之间存在细微但存在的差异
类文本是对类型建模的对象。除此之外,它还提供了有关类型实现的详细信息
引用对象时,使用类型。通用参数也是如此。它们在源代码上用类型表示
例如,在写作时
String foo = "foo";
合法
"".getClass() foo = "foo"
事实并非如此
我希望这是有道理的
编辑:处理泛型时,通常的模式是将类作为参数传递
<T> doSomething(Class<T> clazz);
doSomething(类别clazz);
Edit2:根据@millimoose comments编辑Java不支持该语法,但如果您的目标是创建一个类型由实例类型决定的集合,请创建一个类型化方法,例如:
公共静态列表createList(T对象){
列表=新的ArrayList();
列表。添加(对象);
退货清单;
}
您传入的任何类型都将决定返回列表的类型。这不是一个运行时决定-这是一个编译时检查,但它最接近于我如何解释您的意图。运行时泛型,我们经常在这里看到:)在运行时
ArrayList
只是变成ArrayList
。擦除发生。只是为了让人恼火——这在C#中是可能的。@BenjaminGruenbaum不,不是。C#的泛型仍然主要是编译时类型安全特性(除了有意义地执行typeof(T)
的功能,即免费传递类型标记),因此对于使用反射获得的类型没有意义。这是一个令人困惑的答案,因为Type
是一个JDK类,实际上它的意思与您描述的不同。另外,你提到的模式很有用,但对OP毫无用处。@millimoose你是对的,我不应该用大写字母T来表示类型。我做了一些编辑。
public static <T> List<T> createList(T object) {
List<T> list = new ArrayList<T>();
list.add(object);
return list;
}