为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

缥缈止盈 2019-12-26 09:18:13
我正在查看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文件,每个返回值的示例都在类级别定义或在传入的参数之一中定义。
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

该方法返回您所期望的类型(<X>在方法中定义并且绝对不受限制)。


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


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


我会说:谨慎使用此类构造,因为您几乎失去了所有类型安全,而获得的好处是,不必在每次调用时都编写显式强制转换get()。


是的:这几乎是黑魔法,在运行时会炸毁,打破了泛型应该实现的整个想法。


查看完整回答
反对 回复 2019-12-26
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

类型在方法上声明。这就是“ <X>”的意思。然后将类型的范围限定为仅方法,并且与特定的调用相关。您的测试代码编译的原因是,编译器会尝试确定类型,并且只会在无法确定类型时进行投诉。在某些情况下,您必须明确。


例如,对于该声明Collections.emptySet()是


public static final <T> Set<T> emptySet()

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


Set<String> s = Collections.emptySet();

但是,如果不能,则必须键入:


Collections.<String>emptySet();


查看完整回答
反对 回复 2019-12-26
  • 3 回答
  • 0 关注
  • 765 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信