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

时间:2013-02-12 08:06:14

标签: java intellij-idea refactoring

我有一个抽象的基类,只有一个抽象的方法,我想摆脱它。我想介绍一个带有该方法的新接口,并使所有现有的子类实现该接口,而不是扩展基类。

自:

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

public class Concrete extends Base {
  public Foo getFoo() {
    throw new UnsupportedOperationException();
  }
}

要:

public interface Base {
  Foo getFoo();
}

public class Concrete implements Base {
  public Foo getFoo() {
    throw new UnsupportedOperationException();
  }
}

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

关于如何解决这个问题的任何建议?

2 个答案:

答案 0 :(得分:2)

我现在意识到我设法愚弄自己认为这是一个IDEA问题。相反,它与我尝试在很多泛型引用中内联使用的抽象类型有关,即

final MyMapping<Base, String>  = (...)

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

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

public class ConcreteSomething extends AbstractSomething {
    @Override
    public void foo() {
        throw new UnsupportedOperationException();
    }
}

然后我补充说:

public abstract class AbstractSomething implements Something {..}

和alt-enter on Something选择添加该界面。然后我重构 - >拉取成员并确认将抽象方法移动到Something界面,结果是:

public interface Something {
    void foo();
}
public abstract class AbstractSomething implements Something {
}

光标在ConcreteSomething中的AbstractSomething上闪烁,ctrl + alt + n到内联超类。 AbstractSomething是一个goner,我留下了

public class ConcreteSomething implements Something {
    @Override
    public void foo() {
        throw new UnsupportedOperationException();
    }
}

你必须喜欢这个IDE,它总是比我聪明。

答案 1 :(得分:0)

在超类的名称上键入Alt + Enter,然后调用Convert class to interface。

此快速修复是由“抽象类可能是接口”检查提供的,该检查默认在“不突出显示,仅修复”模式下启用。但是,如果您禁用了它,则需要再次启用它