Java 将现有泛型转换为菱形语法

Java 将现有泛型转换为菱形语法,java,generics,java-7,Java,Generics,Java 7,我比较喜欢Java7引入的泛型菱形语法——不是从节省时间的角度来看(毕竟大多数IDE都为您填充了这一部分),而是因为它使代码看起来更干净。由于这一点和其他原因(主要是因为我正在开发一个新的软件,Java 7中的一些新API将很有用),我很可能会将现有的代码库转换为使用/需要Java 7 然而,有相当一部分已经编写了pre-diamond语法,我希望始终使用diamond语法。是否有IDE快捷方式(我正在使用Netbeans,但显然可以在任何免费IDE中打开项目来完成任务)或其他可以自动切换现有通

我比较喜欢Java7引入的泛型菱形语法——不是从节省时间的角度来看(毕竟大多数IDE都为您填充了这一部分),而是因为它使代码看起来更干净。由于这一点和其他原因(主要是因为我正在开发一个新的软件,Java 7中的一些新API将很有用),我很可能会将现有的代码库转换为使用/需要Java 7


然而,有相当一部分已经编写了pre-diamond语法,我希望始终使用diamond语法。是否有IDE快捷方式(我正在使用Netbeans,但显然可以在任何免费IDE中打开项目来完成任务)或其他可以自动切换现有通用代码以使用菱形语法的方式?

哦,是的,我已经在IntelliJ(免费社区版)上成功地完成了这项工作

菜单>分析>检查代码

在结果中,选择“Java语言级迁移辅助工具>显式类型可以替换为”

右键单击,运行“应用修复”“替换为”“”,您将得到钻石

anomymous类上有一个关于diamond的bug,因此某些代码在修复后可能无法编译。你必须把它们还原回去

// anonymous class, <> doesn't work.
new Factory<Pig>(){ ... }  
// however IntelliJ may wrongly "fix" it to
new Factory<>(){ ... }   // does not compile.
//匿名类不起作用。
新工厂(){…}
//然而IntelliJ可能会错误地将其“修复”到
新工厂(){…}//未编译。

Eclipse检测到冗余类型参数,并提供了一种快速修复方法来删除这些参数并创建菱形,请参阅如果您只想分析菱形而不是所有其他检查,请使用IntelliJ IDEA 12并转到:

分析>按名称运行检验…>在打开>选择下拉条目的提示中键入“explicit type can be Replace with”,然后按Enter键

检查运行后,您可以在屏幕底部的“检查”选项卡中选择应用修复


这比使用常规的“分析>检查代码…”运行每个代码检查要快得多。

使用Eclipse,您可以使用正则表达式使用查找/替换

搜索:

new (\w+)<.+>
新建(\w+)
并替换为:

new $1<>
新的$1

这还将替换任何匿名内部类,因此可能会发生编译错误。

这可以使用Netbeans内置功能“检查和转换”来完成

  • 打开
    重构
    ->
    检查和转换
  • 使用
    单次检验
    可以使用菱形
  • 单击
    Inspect
  • 单击
    Do重构

  • 您还可以使用eclipse“清理”工具。(Source->Clean-Up,tab:不必要的代码,“删除冗余类型参数”)

    我不知道eclipse有这样的功能。但是用30行python脚本应该很容易做到这一点。。找到并替换?这很难奏效。你需要更多的逻辑才能正确工作,但是使用一些正则表达式和python脚本当然是可行的。对于不熟悉diamond语法的人来说,有些链接是可行的:而且@Voo我可以用自定义脚本来完成它,如果归结到这一点的话——我只是想知道是否有什么东西可以让我不再重复发明轮子。例如,IntelliJ常常隐藏着这样的特性;我认为有可能其他人已经遇到或想到了这种情况,并提供了这样一个内置的工具。谢谢,这正是我想要的!我不认为我有很多/任何匿名类以这种方式使用泛型,所以这不应该是一个问题。我用2019.1.1(最终版)成功地测试了这一点,并且您提到的错误没有发生在我的代码上。为了避免匿名内部类的问题,如果您可以假设开始
    {
    在同一行上,您可以通过使用“编辑>替换>包含文本<代码>新(\w+)([^{]+)(?!\{)$并替换为
    新1\2
    在NetBeans中使用编辑>替换>包含文本<代码>新(\w+)并替换为
    新$1
    ,不要忘记在替换为字段(默认为文本)上方的下拉列表中选择匹配:正则表达式JDK迁移支持->可以使用菱形