如何从一般特定的类中获取Class文字

Ble*_*eek 9 java generics gwt

有这样的方法需要Class文字作为参数.

Collection<EmpInfo> emps =  
  SomeSqlUtil.select(  
  EmpInfo.class,  
  "select * from emps");
Run Code Online (Sandbox Code Playgroud)

要么

GWT.create(Razmataz.class);
Run Code Online (Sandbox Code Playgroud)

当我需要提供通用的特定类时,问题出现了

EmpInfo<String>
Razmataz<Integer>
Run Code Online (Sandbox Code Playgroud)

以下是错误的语法

Collection<EmpInfo<String>> emps =  
  SomeSqlUtil.select(  
  EmpInfo<String>.class,  
  "select * from emps");
Run Code Online (Sandbox Code Playgroud)

要么

GWT.create(Razmataz<Integer>.class);
Run Code Online (Sandbox Code Playgroud)

因为你不能做类似的语法

Razmataz<Integer>.class
Run Code Online (Sandbox Code Playgroud)

那么,我怎么能够挤出一个类文字

EmpInfo<String>
Razmataz<Integer>
Run Code Online (Sandbox Code Playgroud)

以便我可以将它们作为参数提供给需要类文字的方法?

更多信息

好吧,我承认我主要是为GWT问这个问题.

我有一对GWT RPC接口Razmataz.(仅供参考,GWT RPC接口必须在服务器 - 客户端对中定义).我计划使用相同的接口对进行通信,无论是String,Integer,Boolean等.

GWT.create(Razmataz)对于Razmataz<T> 抱怨说,因为我没有指定T,GWT编译器把它当作对象.然后GWT编译器不接受Object类.它需要比作为Object更具体.

所以,似乎我无法告诉GWT.create T是什么,因为Class文字是一个运行时概念,而泛型是一个编译时概念,对吧?

Pét*_*rök 7

引用Java泛型和集合,第7.2节:

班级文字也受到限制; 在类文字中为类型提供类型参数在语法上是无效的.因此,以下片段是非法的:

class ClassLiteral {
  public Class<?> k = List<Integer>.class;  // syntax error
}
Run Code Online (Sandbox Code Playgroud)

实际上,Java的语法会使前面的一个短语很难解析,并且可能会触发一连串的语法错误[...]

此语法问题导致不规则.在其他任何需要可再生类型的地方,您可以提供原始类型(例如List)或带有无界通配符的参数化类型(例如List<?>).但是,对于类令牌,您必须提供原始类型; 甚至不会出现无界的通配符.更换List<Integer>List<?>在前面的代码导致类似的错误级联.

所以,你别无选择,只能在类令牌中使用原始类型,比如

GWT.create(Razmataz.class);
Run Code Online (Sandbox Code Playgroud)


Ble*_*eek 3

有人在这里留下了一个简短而简洁的答案,我正要选择它作为答案。不幸的是,那个人删除了那个答案。如果那个人愿意重新发布该答案供我选择。同时,让我陈述一下这个答案以及我如何利用它。

这是我应该想到


Interface RazmatazString extends Razmataz<String>{}

GWT.create(RazmatazString.class);
Run Code Online (Sandbox Code Playgroud)

根据已删除的答案,

我会有一个基本的 Razmataz 接口对,可以做很多事情,我懒得重复。

Abstract class Razmatazer{
.....

  Interface Razmataz<T>{
  // does a lot of RPC stuffs
  }

  Interface RazmatazAsync<T>{
  // does a lot of RPC stuffs
  }

  RazmatazAsync<?> razmatazAsyncRPC;
}
Run Code Online (Sandbox Code Playgroud)

这个概念不是在基类中实例化 razmatazAsyncRPC 句柄,而是在派生类中实例化。

对于 T = 字符串

StringRazmatazer extends Razmatazer{

  Interface RazmatazStringAsync extends RazmatazAsync<String>{}
  Interface RazmatazString extends Razmataz<String>{}

  razmatazAsyncRPC = GWT.create(RazmatazString.class);
}
Run Code Online (Sandbox Code Playgroud)

否则,我将不得不在字符串、映射、布尔值、整数等的各种 T 参数值上重复约 100 行代码,Razmataz 和 RazmatazAsync 各约 50 行。

克服这个障碍的基本前提是——我懒得重复这些台词。