我正在寻找GWT的一些GXT代码,我遇到了泛型的这种使用,我在Java教程中找不到另一个例子.com.extjs.gxt.ui.client.data.BaseModelData
如果要查看所有代码,则为类名.以下是重要部分:
private RpcMap map; publicX get(String property) { if (allowNestedValues && NestedModelUtil.isNestedProperty(property)) { return (X)NestedModelUtil.getNestedValue(this, property); } return map == null ? null : (X) map.get(property); }
X
在类中或层次结构中的任何地方都没有定义,当我在eclipse中点击"go to declaration"时,它只会进入
公共方法签名.
我试着用以下两个例子调用这个方法来看看会发生什么:
public Date getExpiredate() { return get("expiredate"); } public String getSubject() { return get("subject"); }
他们编译并显示没有错误或警告.我认为至少我必须做一个演员才能让它发挥作用.
这是否意味着Generics允许魔法返回值可以是任何东西,并且会在运行时爆炸?这似乎与泛型应该做的事情相反.任何人都可以向我解释这一点,并可能给我一些链接到一些文档,解释这一点好一点?我已经浏览了Sun关于泛型的23页pdf,并且返回值的每个示例都是在类级别定义的,或者是传入的参数之一.
该方法返回一种你期望它的类型(
在方法中定义并且绝对无界限).
这非常非常危险,因为没有规定返回类型实际上与返回值匹配.
它的唯一优点是您不必转换可以返回任何类型的此类通用查找方法的返回值.
我会说:小心使用这样的结构,因为你几乎失去了所有的类型安全性,并且只获得了你不必在每次调用时编写显式的强制转换get()
.
是的:这几乎是黑魔法在运行时爆炸并打破了泛型应该实现的整个想法.
类型在方法上声明.这就是"
"的意思.该类型的范围仅限于方法,并且与特定调用相关.您的测试代码编译的原因是编译器试图确定类型,并且只有在它不能的情况下才会抱怨.有些情况下你必须明确.
例如,声明Collections.emptySet()
是
public static finalSet emptySet()
在这种情况下,编译器可以猜测:
Sets = Collections.emptySet();
但如果不能,你必须输入:
Collections.emptySet();
我只是试图用GXT类找出同样的东西.具体来说,我试图调用一个签名为:
class Model { publicX get(String property) { ... } }
要从您的代码中调用上述方法并将其转换为String,请执行以下操作:
public String myMethod(Data data) { Model model = new Model(data); return model.get("status"); }
上面的代码将调用get方法并告诉它X返回的类型应该作为String返回.
如果该方法与您在同一个类中,我发现我必须用"this"来调用它.例如:
this.get("status");
正如其他人所说,GXT团队相当邋and和危险.