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

Java 在IntelliJ中用接口替换抽象基类,java,intellij-idea,refactoring,Java,Intellij Idea,Refactoring,我有一个抽象基类,其中有一个抽象方法,我想去掉它。我想使用该方法引入一个新接口,并使所有现有子类实现该接口,而不是扩展基类 发件人: 致: 我尝试内联基类但没有成功,手动创建接口,拉取成员,然后删除当时为空的基类,但我似乎无法让IntelliJ自动完成此操作 关于如何解决这个问题,有什么建议吗?我现在意识到,我设法欺骗自己,认为这是一个想法问题。相反,它与我尝试内联的抽象类型有关,该类型在相当多的泛型引用中使用,即 final MyMapping<Base, String> = (

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

发件人:

致:

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


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

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

final MyMapping<Base, String>  = (...)
然后我补充说:

public abstract class AbstractSomething implements Something {..}
然后按alt键输入一些内容,选择添加该接口。然后我重构->向上拉成员并确认将抽象方法移动到Something接口,结果是:

public interface Something {
    void foo();
}
public abstract class AbstractSomething implements Something {
}
当光标在ConcreteSomething中的AbstractSomething上闪烁时,按住ctrl+alt+n键以内联超类。有些事情已经过去了,留给我的只有

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

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

键入Alt并输入超类的名称,然后调用Convert class to interface


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

嗯,您提到了一些您愿意采取的手动步骤,但是您希望最后一个步骤是自动的?你能把你的要求说得更具体些吗?我是说,你试过“提取接口”,对吗?我知道这不会自动将抽象类更改为基类。intellij可能无法完全满足您的要求的原因是它不知道如何处理
Base
中实现的方法。如果Base成为一个接口,它就不会再编译了,因为实现的方法必须去某个地方。理想情况下,我不想做任何手动步骤,我只是试着把它作为一种解决方法。我确实尝试过使用提取接口。接着是一段对话,似乎提供了我想要的东西;Idea试图用接口替换现有基类的用法,但由于未知原因,它无法更改任何基类。Base没有实现方法,除了我想提出的这个抽象方法。
public abstract class AbstractSomething implements Something {..}
public interface Something {
    void foo();
}
public abstract class AbstractSomething implements Something {
}
public class ConcreteSomething implements Something {
    @Override
    public void foo() {
        throw new UnsupportedOperationException();
    }
}