繁体   English   中英

使用类对象作为泛型类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM