【问题标题】:How to declare a Typed Class in Java? [duplicate]如何在 Java 中声明类型化类? [复制]
【发布时间】:2015-10-29 18:49:44
【问题描述】:

我需要声明一个 Map.class 的实例,但是 Map 是类型化的......所以我需要这样的东西:

Class <Map<String, String>> clazz = Map.class;

此行会导致编译错误。什么是简洁的表达方式?

【问题讨论】:

  • 您能否提供一些关于您想要实现的目标的见解?
  • @alexk,我有一种情况,我正在调用一个接收Class&lt;T&gt; 作为参数的方法。就我而言,它将是Class&lt;Map&lt;String, String&gt;。如果我写Map.class,它可以正常工作,但我不喜欢警告......我正在寻找一种方法来消除警告(不使用@SupressWarnings)。

标签: java generics


【解决方案1】:

你可以通过演员来做到这一点。

Class<Map<String, String>> clazz = (Class<Map<String, String>>) (Object) Map.class;

这会生成一个警告,但会编译。

它的问题是由于类型擦除,运行时生成的对象与Map.class没有什么不同(它不知道类型)。

如果您需要一个真正代表Map&lt;String, String&gt; 的对象,您可以考虑使用java.lang.reflect.Type 或Guava 的TypeToken

【讨论】:

  • 很好的答案,先生。我学到了一些新东西。
  • 没问题。很高兴我能帮上忙。
  • 这工作到目前为止,但我不喜欢做铸造......我想要一些不涉及铸造的解决方案,或者更好地说,不会产生警告(@SupressWarnings不是解决方案,只是一种解决方法)...
  • 我同意这不是一个令人满意的解决方案。可悲的是,没有警告就没有办法做到这一点。
  • 基于这最后的评论,我会接受答案...确实没有“100%干净”的方法...
【解决方案2】:
import java.util.*;

public class Test{
  public static void main(String [] args){
   Class <Map> clazz = Map.class;
   System.out.println(clazz);
  }
}

将打印

接口 java.util.Map

【讨论】:

    【解决方案3】:
    Map<String, String> clazz = new HashMap<String, String>()
    

    请记住,Map 是一个接口,不能直接实例化,只能通过实现它的类来实例化,例如 HashMapTreeMap

    【讨论】:

    • class是Java中的保留字,不能作为变量名使用
    • OP 需要一个类,而不是一个地图。
    • @JonK 对,我不在乎变量的名称。谢谢。
    • @morels:我认为这里的 OP 还有另一个问题。您可以从接口获取Class&lt;Map&gt; 对象。但是这里他有一个类型化的 Map,而不是原始的 Map,所以编译器不会让他得到一个 Class&lt;Map&lt;String, String&gt; 对象。抱歉,在您修改答案之前,我会投反对票。
    • 我认为这不是 OP 正在寻找的。 OP 想要一个 Class 类型而不是 Map 的实例。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2020-04-01
    • 2014-03-23
    • 2013-08-07
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多