在 IntelliJ 中用接口替换抽象基类

Kri*_*fer 5 java refactoring intellij-idea

我有一个抽象基类,其中有一个我想删除的抽象方法。我想用该方法引入一个新接口,并使所有现有子类实现该接口而不是扩展基类。

从:

public abstract class Base {
  public abstract Foo getFoo();
}

public class Concrete extends Base {
  public Foo getFoo() {
    throw new UnsupportedOperationException();
  }
}
Run Code Online (Sandbox Code Playgroud)

到:

public interface Base {
  Foo getFoo();
}

public class Concrete implements Base {
  public Foo getFoo() {
    throw new UnsupportedOperationException();
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试内联基类但没有成功,手动创建接口,拉动成员,然后删除当时空的基类,但我似乎无法让 IntelliJ 自动完成此操作。

关于如何解决这个问题有什么建议吗?

Kri*_*fer 2

我现在意识到我成功地欺骗了自己,让自己认为这是一个 IDEA 问题。相反,它与我尝试内联的抽象类型有关,在很多泛型引用中使用,即

final MyMapping<Base, String>  = (...)
Run Code Online (Sandbox Code Playgroud)

IDEA 无法猜测我想用所有这些通用引用做什么。这些必须手动解决,除此之外,以下内容确实有效。我从以下开始:

public abstract class AbstractSomething {
    public abstract void foo();
}

public class ConcreteSomething extends AbstractSomething {
    @Override
    public void foo() {
        throw new UnsupportedOperationException();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我添加:

public abstract class AbstractSomething implements Something {..}
Run Code Online (Sandbox Code Playgroud)

并在 Something 上按 Alt-Enter 键选择添加该界面。然后我重构->拉出成员并确认将抽象方法移动到 Something 接口,结果是:

public interface Something {
    void foo();
}
public abstract class AbstractSomething implements Something {
}
Run Code Online (Sandbox Code Playgroud)

当光标在 ConcreteSomething 中的 AbstractSomething 上闪烁时,按 ctrl+alt+n 到内联超类。摘要有些东西已经消失了,我只剩下

public class ConcreteSomething implements Something {
    @Override
    public void foo() {
        throw new UnsupportedOperationException();
    }
}
Run Code Online (Sandbox Code Playgroud)

你一定会喜欢这个 IDE,它总是比我聪明。