这些方法需要使用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文字是运行时概念,而泛型是编译时概念,对吗?
答案 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等。
克服这个障碍的基本前提是 - 我懒得重复这些界限。