Java 我可以使用重构来交换变量的类型吗?

Java 我可以使用重构来交换变量的类型吗?,java,android-studio,refactoring,Java,Android Studio,Refactoring,Android Studio提供了强大的重构功能,例如重命名。我可以使用它来更改变量、字段和参数的名称,但是我似乎找不到重命名类型的方法。例如: LinearLayout layout = (LinearLayout) v.findViewById(....); // ........ // A bunch of code using `layout` many times 如何快速将LinearLayout重构为RelativeLayout,并将其应用于代码的其余部分?我可以对字段执行同样的

Android Studio提供了强大的重构功能,例如重命名。我可以使用它来更改变量、字段和参数的名称,但是我似乎找不到重命名类型的方法。例如:

LinearLayout layout = (LinearLayout) v.findViewById(....);
// ........
// A bunch of code using `layout` many times
如何快速将
LinearLayout
重构为
RelativeLayout
,并将其应用于代码的其余部分?我可以对字段执行同样的操作吗?

简短回答 您正在寻找的功能是类型迁移

通过右键单击变量或字段的类型,然后选择重构->类型迁移,可以执行类型迁移。或者,您可以使用以下键盘快捷键:

  • 在Mac上:Shift+⌘ + F6
  • 在Windows上:Shift+Ctrl+F6
只需选择您要迁移到的类型,单击重构,Android Studio就开始发挥其魔力


长而详细的回答 你似乎误解了重命名的实际作用

“重命名”可用于逐字重命名元素。因此,您可以使用它更改变量、参数、方法或类的名称。例如,如果您有一个名为
Foo
的类,并且希望将其名称更改为
Bar
,则可以通过重命名轻松完成此操作

但是不能重命名
LinearLayout
,因为它是框架类,当然不能修改。但是,这应该不是问题,因为您实际上不想重命名
LinearLayout
,是吗?实际上,您要做的是将类型从
LinearLayout
更改为
RelativeLayout
。还有另一个非常有用的重构特性,就是类型迁移

您可以通过右键单击要交换其类型的任何变量,然后选择重构->类型迁移来执行类型迁移。之后会弹出一个对话框,您可以输入要迁移到的类型(在您的情况下为
RelativeLayout
)。然后点击重构,Android Studio就开始发挥它的魔力。可能会有一个额外的弹出窗口,通知您代码中所有无法自动迁移的内容。只需浏览冲突列表,完成后点击忽略并手动修复这些冲突

下面是一个工作中类型迁移的示例。我从以下代码开始:

private LinearLayout mLayout;

private void doStuff(ViewGroup container) {
    LinearLayout layout = (LinearLayout) container.findViewById(0);

    layout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ...
        }
    });

    mLayout = layout;
    fooTheBar(layout);   
}

private void fooTheBar(LinearLayout layout) {
    ...
}
现在我对
doStuff()
中的局部变量
layout
执行了类型迁移到
RelativeLayout
。结果如下所示:

private RelativeLayout mLayout;

private void doStuff(ViewGroup container) {
    // Here is the only conflict which could not be refactored automatically.
    // I had to change the cast to RelativeLayout manually.
    RelativeLayout layout = (LinearLayout) container.findViewById(R.id.linearLayout);

    layout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ...
        }
    });

    mLayout = layout;
    fooTheBar(layout);
}

private void fooTheBar(RelativeLayout layout) {
    ...
}
正如您所看到的,类型迁移做了出色的工作。字段的类型,甚至
fooTheBar()
的参数类型都更改为
RelativeLayout
。只有一场冲突。Android Studio无法自动更改
doStuff()
顶部的演员阵容类型。我必须手动修复它。正如我前面提到的,我在执行重构时被警告过这种冲突

当然,您可以问自己,为什么它可以自动更改字段和参数的类型,但不能更改强制转换的类型,但如果您仔细想想,这实际上很有意义:


无法自动迁移的代码部分是
(LinearLayout)container.findViewById(R.id.LinearLayout)
。当然,此方法会查找id为
R.id.linearLayout
视图。此
视图
可以在布局xml中定义,也可以在运行时动态添加到
容器
,但在任何情况下,都不能在不破坏功能的情况下自动重构。这是只有开发人员才能决定如何处理的事情,这就是为什么要警告您。

对于Kotlin文件中的
类型迁移

假设要在以下函数中将输入参数从
String
更改为
Int

fun getValue(key: String){
}
  • 将光标放在要更改的类型上(本例中为字符串)

  • 右键单击>重构>更改 签名。或使用以下快捷方式执行此步骤:

    • Mac:⌘ + F6
    • Windows:Ctrl+F6(未测试)
  • 完成步骤2将打开此窗口,单击以蓝色突出显示的行:

  • 将类型替换为所需的任何类型,然后单击重构

  • 太好了,谢谢!我没有想到在类型上而不是字段上单击
    右键
    ,这就是为什么没有注意到
    类型迁移
    选项的原因。这在Java文件上非常有效,但是,在Kotlin文件中没有
    类型迁移
    选项。Kotlin有什么解决办法吗?