2012-06-29 30 views
3

我有類似的接口層次 -Java:如何在界面層次結構中返回聲明的類型?

interface Type 
{ 
    Type copy(); 
}; 

interface SubType extends Type 
{ 
}; 

interface SubSubType extends SubType 
{ 
}; 

而具體的類

public class Concrete implements SubSubType 
{ 
    @Override public Concrete copy() { return new Concrete(); } 
} 

我希望能夠在一個呼叫類型副本(),並得到一個類型回來,調用拷貝()在SubType上並返回一個SubType,這是可以實現的嗎?可能與泛型?

在此先感謝。

回答

5

像這樣:

public interface Type { 
    public Type copy(); 
} 

public interface SubType extends Type { 
    public SubType copy(); 
} 

public class Concrete implements Type { 
    @Override 
    public Concrete copy() { 
    return new Concrete(); 
    } 
} 

public class SubConcrete implements SubType { 
    @Override 
    public SubConcrete copy() { 
    return new SubConcrete(); 
    } 
} 

public static void main(String[] args) { 
    Type type = new Concrete(); 
    SubType subType = new SubConcrete(); 

    Type newType = type.copy(); 
    SubType newSubType = subType.copy(); 
} 
+0

這是合法嗎?它如何知道你是否返回一個Type(在Type接口中聲明)或SubType(如在SubType接口中聲明的)?你是通過不尋常的返回類型重載。 (這是Java 7中的新東西,還是我真的落後於時代?) – user949300

+1

@user:這是Java 5中的新功能。它被稱爲[返回類型協變](http://en.wikipedia.org/wiki/Covariant_return_type )。編譯器會認爲靜態返回類型是你調用'copy()'的變量聲明類型的返回類型。換句話說,如果你有一個'Type type = new SubConcrete();''你不能'SubType subType = type.copy()'沒有強制轉換。 –

+0

@Mark Peters謝謝!儘管如此,我仍然覺得很困惑,但我可以看到它可能有用。國際海事組織,我的解決方案更清晰(更明確)。因人而異。 – user949300

-1

我覺得你可以去

interface <T extends Type> Type { 
    T copy(); 
} 

interface SubType extends Type<SubType> { 
    // any extra methods here 
} 

屆時,實現將

public class Concrete implements SubType { 
    public SubType copy() { 
     // code here 
    } 
} 

根據記錄,調用方法複製()時它不會複製任何東西是一個非常糟糕的主意。

編輯:更正下面的代碼。爲了簡單起見,SubXXX接口被作爲內部類放入,實際上這不太可能有意義。很顯然,我需要切換訂單。咄!

public interface Type<T extends Type<?>> { 
    T copy(); 

    public interface SubType<T extends SubType<?>> extends Type<T> {  
    } 

    public interface SubSubType extends SubType<SubSubType> {  
    } 
} 

,並實現可能看起來像:

class Concrete implements SubType<Concrete> { 

     @Override 
     public Concrete copy() { 
     return new Concrete(); 
     }  
    } 

這看起來確實相當混亂,我喜歡(和公正投票)@Tim POTE答案。

+1

這是否甚至編譯:'interface Type'?似乎不適合我。如果將其更改爲'interface Type ',您將得到一個編譯器警告,您可以通過執行此操作來修復:''Type >'。但是,對SubType而言會更困惑,而且更容易混淆SubSubType。 –

+0

我沒有帶編譯器在我的電腦上,所以它必須等到明天才能查看詳細信息。但我過去做過類似的事情。 – user949300

+0

它應該只是'接口類型'。然後'interface SubType extends Type ' – newacct