有这样的方法需要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文字是一个运行时概念,而泛型是一个编译时概念,对吧?
引用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)
有人在这里留下了一个简短而简洁的答案,我正要选择它作为答案。不幸的是,那个人删除了那个答案。如果那个人愿意重新发布该答案供我选择。同时,让我陈述一下这个答案以及我如何利用它。
这是我应该想到的
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 行。
克服这个障碍的基本前提是——我懒得重复这些台词。
| 归档时间: |
|
| 查看次数: |
3451 次 |
| 最近记录: |