【问题标题】:Java and Eclipse -- Replace `extends` and `super` with `returns` and `accepts`Java 和 Eclipse——用 `returns` 和 `accepts` 替换 `extends` 和 `super`
【发布时间】:2012-08-18 09:38:05
【问题描述】:

如果我错了,请纠正我,但我最近注意到 Java 中的通配符...

? super T 几乎是指? accepts T

还有……

? extends T 一般表示? returns T。

假设我有一个List<? extends Cat>。除了想从中获得Cat之外,我还有什么理由宣布这一点吗?或者LitterBox<? super Cat> 呢?除非我想将Cat(或传递Cat 的东西)传递给它,否则我会宣布这样的事情吗?

所以假设理由成立......

有什么方法可以让 Eclipse 同时突出显示语法并自动将accepts 和returns 替换为super 和extends?

另外,除了“我必须在让其他人查看之前我必须正则表达式我的代码”之外,还有什么理由认为这可能不是一个好主意吗?

【问题讨论】:

  • Java 被有意设计为不允许这样的事情。你正在寻找很多痛苦......只要正确地学习语言。
  • 为什么投反对票?我需要澄清吗?我在冒犯吗?我研究过了,很多地方都推荐这样的约定……还有,我查了一下怎么做,没用……
  • Eclipse 可以添加替换文本,您输入的单词会被其他内容替换。也许这会奏效,但可能仅限于全球范围内。
  • 嗯,能给个链接吗? Google 仅提供“查找/替换”Eclipse 功能。
  • Eclipse 术语是“模板”。 help.eclipse.org/juno/…

标签: java regex eclipse syntax-highlighting wildcard


【解决方案1】:

那么有什么方法可以让 Eclipse 同时使用语法高亮和自动替换接受并使用 super 和 extends 返回?

我想您可以修改(即破解)Eclipse JDT 编辑器来执行此操作,但这并不简单。

另外,除了“我必须在让其他人查看之前我必须正则表达式我的代码”之外,还有什么理由认为这可能不是一个好主意?

这还不够吗?

怎么样:

  • “我必须先正则表达式我的代码,然后标准 Java 工具链才能理解它”,或者

  • “不再是 Java”?

或者就此而言,Oracle 没有将其作为语言特性的任何原因?

因为对 Oracle 或绝大多数 Java 开发人员来说,对语言语法进行无偿的修饰性更改没有任何价值。


看,如果您想发明自己的编程语言,请随意。但建议对 Java 语言进行颠覆性更改……坦率地说……毫无意义。


我不是在要求“颠覆性改变”,我是在问他们为什么一开始不使用类似的语法

你问错人了。问他们”。

【讨论】:

  • 呃,jar hacking 绝对不值得。我更多地考虑 Eclipse 可脚本性,因为我可以想象用 Xcode 来做这件事的方法。抱歉,我不是在要求“破坏性更改”,我是在问他们为什么不首先使用类似的语法(因为这可能是我现在不使用它的一个很好的理由。)但我理解为什么那句话会被这样解释(见上文。)至于 Java 工具链——是的,这是一个相当大的问题……但第二点——这有什么问题?
  • (元问题:为什么这么多 SO Questions 会问这种事情。你们真的认为我们在引导 Bill Gosling 和他的团队吗?或者我们可以搜查他们的文件柜/电子邮件20 年前的档案?)
  • “但第二点——这有什么问题?” - 询问贵公司的 IT 经理 ...
【解决方案2】:

当然,Oracle 没有将其作为语言特性的原因有很多,例如:

  1. 两个新的保留关键字;
  2. super 和 extends 几乎完全理解了意思;
  3. accepts 和 returns 在那些位置甚至没有任何意义;它可能只对它们进行想象有用,以帮助您进行总体理解。 T extends List 类型既不接受也不返回任何内容。

【讨论】:

  • 我会逐一分析你的观点。 1. 好的,我明白了,但有点苛刻? 2.没有任何建设性,你基本上没有任何理由地说“我不同意你的假设”。为什么接受和返回的有效性更低?我敢肯定他们可能是,只是我在问为什么。 3. 它们确实有意义,以至于 Oracle 的文档实际上建议了这样的约定。假设我有一个List<? extends Cat>。保证为所有通用返回类型返回Cat,对吗?如果它是 List<? super Cat>,则保证接受 cat 的所有通用参数。
  • 第 2. 点和第 3. 点的相似之处在于 2. 声称原始关键字 确实 捕获了正确的含义,并且 3. 声称您的替代关键字 没有。这些是我不同意的论据,而不是不同意的陈述。考虑一下:List 是一个类型。它不是方法,方法是接受或返回值的方法。短语“List<? extends Cat返回Cats”确实没有直接意义。该类型不做这样的事情,它的成员方法可能会也可能不会这样做。
  • 我未投票,感谢您的澄清。但是,我不同意“可能或可能不会”返回/接受 - 如果您实际上没有从目的。如果您从未将猫从其中拉出,为什么要声明List<? extends Cat>?如果您从不将猫(或会通过猫的东西)传给它,为什么还要List<? super Cat>?
  • 我们同意使用类型边界的通常方式。但是,整个语言都采用仅适用于典型用例的关键字是不合适的。例如,您可能有一个标记接口,其类型参数可能仅有助于通过推理将该类型信息传递到其他点。在类型理论层面,这些只是类型的上限和下限,关键字几乎完全符合这个含义。
  • 但是,我认为第一点实际上是最强的。将保留关键字放入具有通用标识符的相同命名空间的编程语言总是倾向于最大限度地重用相同的关键字。如果它具有 Lispy 或类似 XML 的语法,那么 Java 可能确实会使用您的术语。
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
相关资源
最近更新 更多