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;
}