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

时间:2010-05-19 09:10:01

标签: java generics gwt

这些方法需要使用Class literals作为参数。

Collection<EmpInfo> emps =  
  SomeSqlUtil.select(  
  EmpInfo.class,  
  "select * from emps");

GWT.create(Razmataz.class);

当我需要提供像

这样的通用特定类时,问题出现了
EmpInfo<String>
Razmataz<Integer>

以下是错误的语法

Collection<EmpInfo<String>> emps =  
  SomeSqlUtil.select(  
  EmpInfo<String>.class,  
  "select * from emps");

GWT.create(Razmataz<Integer>.class);

因为你不能像

那样做语法
Razmataz<Integer>.class

那么,我怎样才能从

中挤出一个类文字
EmpInfo<String>
Razmataz<Integer>

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

更多信息

好的,我承认我主要是为GWT问这个。

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

GWT.create(Razmataz)的{​​p> Razmataz<T> 抱怨说,由于我没有指定T,GWT编译器将其视为对象。然后GWT编译器不接受Object类。它需要比作为对象更具体。

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

3 个答案:

答案 0 :(得分:7)

引自Java Generics and Collections,第7.2节:

  

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

class ClassLiteral {
  public Class<?> k = List<Integer>.class;  // syntax error
}
  

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

     

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

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

GWT.create(Razmataz.class);

答案 1 :(得分:3)

你不能。

使用不安全的演员:

Collection<EmpInfo<String>> emps = 
     (Collection<EmpInfo<String>>) someMethod(EmpInfo.class);

答案 2 :(得分:3)

有人在这里留下了一个简短而简洁的答案,我将选择作为答案。不幸的是,那个人删除了这个答案。如果那个人会如此友好地重新发布该答案供我选择。与此同时,请允许我说明答案以及我如何利用它。

这是我应该想到的


Interface RazmatazString extends Razmataz<String>{}

GWT.create(RazmatazString.class);

根据已删除的答案,

我会有一个基本的Razmataz接口对做了很多东西,我懒得重复。

Abstract class Razmatazer{
.....

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

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

  RazmatazAsync<?> razmatazAsyncRPC;
}

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

对于T = String

StringRazmatazer extends Razmatazer{

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

  razmatazAsyncRPC = GWT.create(RazmatazString.class);
}

否则我将不得不重复~100行代码,Razmataz和RazmatazAsync分别为50行,各种T参数值,String,Map,Boolean,Integer等。

克服这个障碍的基本前提是 - 我懒得重复这些界限。

相关问题