有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用类对象作为泛型类型的java

我不完全确定如何问这个问题,这也是为什么我不确定标题等等。来吧

假设您有一个对象Foo foo = new Foo()。是否可以编写类似new ArrayList<foo.getClass()>()的代码,在运行时与new ArrayList<Foo>()等效

另一个相关的问题是:假设类Foo扩展了Exception。那么有没有可能写出这样的东西

try{
    // ...
} catch(foo.getClass() e) {
    //
}

这将转化为

try{
    // ...
} catch(Foo e) {
    //
}

?

这样做是否可怕并不重要。不过,无论如何,我还是希望听到有保留的意见


共 (3) 个答案

  1. # 1 楼答案

    类型和它的类文本之间有一个微妙但存在的区别

    类文本是一个为类型建模的对象。除此之外,它还提供了有关该类型实现的详细信息

    引用对象时,使用类型。通用参数也是如此。它们在源代码中用类型表示

    例如,在写作时

    String foo = "foo";
    

    合法吗

    "".getClass() foo = "foo"
    

    事实并非如此

    我希望这是有道理的

    编辑:处理泛型时,通常的模式是将类作为参数传递

    <T> doSomething(Class<T> clazz);
    

    编辑2:根据@millimoose评论编辑

  2. # 2 楼答案

    不,这在Java语言规范中是不可能的。泛型参数纯粹是一种编译时类型的安全机制,所以在运行时定义它们是没有意义的

    代码中的类文本不能与Class<T>对象互换,因为它们的角色本质不同。后者只有在运行时才有意义,并且可以动态变化

  3. # 3 楼答案

    Java不支持这种语法,但如果您的目标是创建一个类型由实例类型决定的集合,请创建一个类型化方法,例如:

    public static <T> List<T> createList(T object) {
        List<T> list = new ArrayList<T>();
        list.add(object);
        return list;
    }
    

    您传入的任何类型都将决定返回列表的类型。这不是一个运行时决定——这是一个编译时检查,但它最接近于我如何解释您的意图