【问题标题】:How to fake C++-style "auto" type deduction with IntelliJ?如何使用 IntelliJ 伪造 C++ 风格的“自动”类型推导?
【发布时间】:2016-05-06 06:21:51
【问题描述】:

在 Java 的某些应用程序中,我缺少 C++ 中的“auto”关键字。不要误会,这绝对不是关于语言哲学或编程实践的讨论。

例如,如果我有一个 Map of Maps,并且我想拥有关联的条目集,则代码如下所示:

Map<String, Map<String, VeryLongClassNameGetsEvenLongerAndLonger>> map = new HashMap<>();

Set<Map.Entry<String, Map<String, VeryLongClassNameGetsEvenLongerAndLonger>>> entryset = map.entrySet();

现在变量“entryset”的类型很难输入和正确输入。在 C++ 中,我会在这里使用 auto 。这在 Java 中不存在,所以我使用 IntelliJ IDE 提供的下一个最好的东西。我输入

Integer entryset = map.entrySet();

这显然是不正确的,但这会提示 IntelliJ 向我建议:

Change variable 'entryset' type to 'Set<Map.Entry<String, Map<String, VeryLongClassNameGetsEvenLongerAndLonger>>>

所以我只需按 Alt-Enter 即可自动更正。

但是,我想知道:我可以在不通过更正功能的情况下做到这一点吗?诸如“自动完成类型”之类的东西——热键、/auto/ pragma 之类的?

【问题讨论】:

  • 就用 Kotlin,兄弟

标签: java generics intellij-idea


【解决方案1】:
  • 你可以在后面输入一个表达式和.var,然后按Tab,它会创建一个变量声明

  • 你可以写一个表达式,然后按Ctrl+Alt+V(默认),表达式将被提取到一个新变量。

  • 如果您喜欢使用 varval 关键字的 C#/Scala/Kotlin 样式声明,您可能会发现有用的 Varsity 插件。

    它可以让你以如下方式编写变量声明:

    var entrySet = map.entrySet();
    

    然后你按 Enter 就变成了

    Set<Map.Entry<TheKeyType, TheValueType>> entrySet = map.entrySet();
    

【讨论】:

  • 不用任何插件也能达到同样的效果。只需输入map.entrySet() 并按CTRL-ALT-VMore info.
  • @djxak,是的,甚至只需在表达式后输入.var + Tab
  • 非常感谢!我喜欢前两个选项。有什么我可以在循环头中使用的东西,比如for (something entry : map.entrySet())?我试过了,在那种情况下,这些选项都不能很好地工作。
  • 没关系,我发现输入 iter&lt;tab&gt; 可以满足我的要求,但效果更好。
【解决方案2】:

不要输入类型。 Intellij 将建议创建一个局部变量,并从返回类型推断。例如。输入...

entryset = map.entrySet();

entryset 现在将显示为红色,表示错误。

然后ALT+ENTER,应该会显示一个小菜单,其中创建局部变量作为选项。

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多