2013-02-12 18 views
3

我有一個抽象基類,我想刪除一個抽象方法。我想介紹一個新的接口與該方法,並使所有現有的子類來實現該接口,而不是擴展基類。用IntelliJ中的接口替換抽象基類

來源:

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

關於如何解決這個問題的任何建議?

+0

嗯,你提到了一些你願意採取的手動步驟,但是你希望最後一步是自動的?你能否提出更具體的要求?我的意思是,你已經嘗試過「提取界面」,對吧?我知道這不會自動將抽象類更改爲Base。 – 2013-02-12 08:11:29

+1

intellij *可能*不能完全滿足你要求的原因是它不知道如何處理'Base'中的已實施方法。如果Base成爲一個接口,它將不再編譯,因爲實現的方法將不得不去某處。 – 2013-02-12 08:12:40

+0

理想情況下,我不想做任何手動步驟,我只是試着將其作爲解決方法。我確實嘗試使用提取界面。隨後的對話似乎提供了我想要的; Idea提供嘗試用接口替換現有基類的使用,但由於未知原因它不能改變它們中的任何一個。基地沒有實施的方法,除了這個我想拉起來的抽象的單一的方法。 – Kristoffer 2013-02-12 09:29:56

回答

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組合。我然後refactor->拉構件和確認到抽象方法移動到東西界面,結果是:

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

當光標在ConcreteSomething,Ctrl + Alt + N上AbstractSomething閃爍內聯超類。摘要這裏有一些東西,我只剩下

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

你只需要愛這個IDE,它總是比我更聰明。