我正在研究一些用于GWT的GXT代码,我遇到了泛型的这种用法,在Java教程中找不到其他的例子。如果您想查看所有代码,则类名为com.extjs.gxt.ui.client.data.BaseModelData
。以下是重要的部分:
private RpcMap map;
public <X> X get(String property) {
if (allowNestedValues && NestedModelUtil.isNestedProperty(property)) {
return (X)NestedModelUtil.getNestedValue(this, property);
}
return map == null ? null : (X) map.get(property);
}
X
在类的其他地方或层次结构中的任何地方都没有定义,当我在eclipse中点击“转到声明”时,它只是转到公共方法签名中的<X>
。
我试着用下面的两个例子来调用这个方法,看看会发生什么:
public Date getExpiredate() {
return get("expiredate");
}
public String getSubject() {
return get("subject");
}
它们进行编译,不显示任何错误或警告。我想至少我得做个演员组才能让它工作。
这是否意味着泛型允许一个神奇的返回值,它可以是任何东西,并且会在运行时爆炸?这似乎与泛型应该做的事情背道而驰。有没有人可以向我解释这一点,并可能给我一些更好地解释这一点的文档的链接?我已经阅读了Sun关于泛型的23页pdf,返回值的每个示例都是在类级别定义的,或者是在传入的参数中定义的。
发布于 2008-12-03 22:05:42
该方法返回一个您期望的类型(<X>
是在该方法中定义的,并且是绝对无界的)。
这是非常非常危险的,因为没有规定返回类型实际上与返回值匹配。
这样做的唯一好处是,您不必强制转换这些可以返回任何类型的泛型查找方法的返回值。
我要说的是:要小心使用这样的结构,因为您几乎失去了所有的类型安全,并且只获得了不必在每次调用get()
时都编写显式强制转换的好处。
是的,这在很大程度上是一种黑魔法,它在运行时就失效了,打破了泛型应该实现的整个想法。
发布于 2008-12-03 22:02:54
该类型在方法上声明。这就是"<X>
“的意思。然后,该类型的作用域仅限于该方法,并且与特定调用相关。你的测试代码编译的原因是编译器试图确定类型,只有在不能的时候才会报错,有些情况下你必须明确。
例如,Collections.emptySet()
的声明是
public static final <T> Set<T> emptySet()
在这种情况下,编译器可以猜测:
Set<String> s = Collections.emptySet();
但是如果它不能,你必须输入:
Collections.<String>emptySet();
发布于 2011-09-27 22:38:59
我只是想用一个GXT类来解决同样的问题。具体地说,我试图使用以下签名调用一个方法:
class Model {
public <X> X get(String property) { ... }
}
为了从你的代码中调用上面的方法,并让它将X转换为一个字符串,我执行以下操作:
public String myMethod(Data data) {
Model model = new Model(data);
return model.<String>get("status");
}
上面的代码将调用get方法,并告诉它X返回的类型应该作为字符串返回。
在方法与您位于同一类的情况下,我发现我必须使用"this.“来调用它。例如:
this.<String>get("status");
正如其他人所说,这对于GXT团队来说是相当草率和危险的。
https://stackoverflow.com/questions/338887
复制相似问题