【问题标题】:Using class object as generic type使用类对象作为泛型类型
【发布时间】:2013-10-17 07:25:37
【问题描述】:

我不完全确定如何问这个问题,这也是我不确定标题等的原因。来了。

假设你有一个对象Foo foo = new Foo()。是否可以编写像new ArrayList<foo.getClass()>() 这样的代码,在运行时相当于new ArrayList<Foo>()

另一个但相关的问题是:假设类Foo 扩展了Exception。那么是否可以写类似的东西

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

这将转化为

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

?

这样做是否可怕,并不是重要的部分。不过,我还是想听听有资格的意见。

【问题讨论】:

  • 运行时泛型,我们经常在这里得到这些 :) 在运行时ArrayList<T> 只是变成ArrayList。发生擦除。只是烦人 - 在 C# 中是可能的。
  • @BenjaminGruenbaum 不,不是。 C# 的泛型仍然主要是一种编译时类型安全特性(除了能够有意义地执行typeof(T),即您可以免费获得一个类型令牌),因此不要使用反射获得的类型来感知。

标签: java exception generics exception-handling


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    类型与其 Class 字面量之间存在细微但存在的差异。

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

    当你引用一个对象时,你使用了一个类型。泛型参数也是如此。它们在源代码中以类型表示。

    例如,在写作时

    String foo = "foo";
    

    合法

    "".getClass() foo = "foo"
    

    不是。

    我希望这是有道理的。

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

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

    Edit2:根据@millimoose cmets 编辑

    【讨论】:

    • 这是一个令人困惑的答案,因为Type 是一个 JDK 类,它的实际含义与您所描述的不同。另外,您提到的模式很有用,但对OP没有用。
    • @millimoose 你是对的,我不应该使用大写的 T 作为类型。我做了一些修改。
    【解决方案3】:

    Java 不支持该语法,但如果您的目标是创建一个类型由实例类型确定的 Collection,请创建一个类型化方法,例如:

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

    您传入的任何类型都将确定返回的 List 的类型。这不是运行时确定 - 它是编译时检查,但它是最接近我解释您意图的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      相关资源
      最近更新 更多