4

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

从:

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 自动完成此操作。

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

4

2 回答 2

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。然后我重构->拉起成员并确认将抽象方法移动到Something接口,结果是:

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

当光标在 ConcreteSomething 中的 AbstractSomething 上闪烁时,按 ctrl+alt+n 来内联超类。AbstractSomething 已经过去了,我只剩下

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

你只需要喜欢这个 IDE,它总是比我聪明。

于 2013-02-19T13:17:39.467 回答
0

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

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

于 2019-09-30T12:11:41.307 回答