首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java泛型:泛型类型仅定义为返回类型

Java泛型:泛型类型仅定义为返回类型
EN

Stack Overflow用户
提问于 2008-12-03 21:58:01
回答 6查看 62.5K关注 0票数 71

我正在研究一些用于GWT的GXT代码,我遇到了泛型的这种用法,在Java教程中找不到其他的例子。如果您想查看所有代码,则类名为com.extjs.gxt.ui.client.data.BaseModelData。以下是重要的部分:

代码语言:javascript
复制
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>

我试着用下面的两个例子来调用这个方法,看看会发生什么:

代码语言:javascript
复制
public Date getExpiredate() {
    return  get("expiredate");
}

public String getSubject() {
    return  get("subject");
}

它们进行编译,不显示任何错误或警告。我想至少我得做个演员组才能让它工作。

这是否意味着泛型允许一个神奇的返回值,它可以是任何东西,并且会在运行时爆炸?这似乎与泛型应该做的事情背道而驰。有没有人可以向我解释这一点,并可能给我一些更好地解释这一点的文档的链接?我已经阅读了Sun关于泛型的23页pdf,返回值的每个示例都是在类级别定义的,或者是在传入的参数中定义的。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-12-03 22:05:42

该方法返回一个您期望的类型(<X>是在该方法中定义的,并且是绝对无界的)。

这是非常非常危险的,因为没有规定返回类型实际上与返回值匹配。

这样做的唯一好处是,您不必强制转换这些可以返回任何类型的泛型查找方法的返回值。

我要说的是:要小心使用这样的结构,因为您几乎失去了所有的类型安全,并且只获得了不必在每次调用get()时都编写显式强制转换的好处。

是的,这在很大程度上是一种黑魔法,它在运行时就失效了,打破了泛型应该实现的整个想法。

票数 57
EN

Stack Overflow用户

发布于 2008-12-03 22:02:54

该类型在方法上声明。这就是"<X>“的意思。然后,该类型的作用域仅限于该方法,并且与特定调用相关。你的测试代码编译的原因是编译器试图确定类型,只有在不能的时候才会报错,有些情况下你必须明确。

例如,Collections.emptySet()的声明是

代码语言:javascript
复制
public static final <T> Set<T> emptySet()

在这种情况下,编译器可以猜测:

代码语言:javascript
复制
Set<String> s = Collections.emptySet();

但是如果它不能,你必须输入:

代码语言:javascript
复制
Collections.<String>emptySet();
票数 40
EN

Stack Overflow用户

发布于 2011-09-27 22:38:59

我只是想用一个GXT类来解决同样的问题。具体地说,我试图使用以下签名调用一个方法:

代码语言:javascript
复制
class Model {
    public <X> X get(String property) { ... }
}

为了从你的代码中调用上面的方法,并让它将X转换为一个字符串,我执行以下操作:

代码语言:javascript
复制
public String myMethod(Data data) {
    Model model = new Model(data);
    return model.<String>get("status");
}

上面的代码将调用get方法,并告诉它X返回的类型应该作为字符串返回。

在方法与您位于同一类的情况下,我发现我必须使用"this.“来调用它。例如:

代码语言:javascript
复制
this.<String>get("status");

正如其他人所说,这对于GXT团队来说是相当草率和危险的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/338887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档