2008-11-24 52 views
2

返回類型重載方法我可以摺疊這兩個「getFields」的方法爲使用泛型一個(第二個方法旨在包專用接入),或者我應該重新命名第二個到像「getFieldPackagePrivate」醜陋的東西?通過在Java

public interface IField { 

} 


class Field implements IField { // package private class 

} 


    public class IForm { 


    public List<IField> getFields(); 

    } 



public class Form { 
    private List<Field> fields; 


    public List<IField> getFields() { 
    return this.fields; 

    } 

    List<Field> getFields() { // package visible 
    return this.fields; 

    } 

} 

的基本用法會是這樣

// by interfece - from client code 

    IForm form; 
    List<IField> list = form.getFields(); 

// by class - from other classes in the same package 
    Form form2; 
    List<Field> list2 = forms2.getFields(); 

的想法是有一個乾淨,保存界面從包可見實施clacces的外面的世界和方便(無需向下轉換)。我的字段類有幾個方法,我不希望被客戶看到,但需要從同一個包中的其他類調用(例如setLabel等)

+0

@lbownik:我已經改變了標題談論過載而而不是壓倒一切,因爲就我所知,這就是你真正感興趣的東西。讓我知道如果這是不正確的。 – 2008-11-24 14:09:00

+0

hm。是不是允許協變?也許他可以從其中將包含列表接口返回基地,並從其中將包含列表實施派生? – 2008-11-24 14:46:39

回答

3

你可以寫(根據我的答案你前面的問題):

public List<? extends IField> getFields() 

,但你不能返回類型超載,你不能在一個公共方法暴露一個包專用型。

編輯:隨着問題的變化,答案是一個簡單的「不」。你必須重新命名你的其他方法。

+0

我重新編輯了一下,使我的意圖更清晰 - 請看看阿加尼。謝謝。 – 2008-11-24 14:19:46

3

號基於Java中的返回類型不能有多態性。

0

之後我嘗試了一點,我發現基於喬恩斯基特的回答

的代碼看起來像這樣的解決方案。

public interface IField { 

} 


class Field implements IField { // package private class 

} 


    public class IForm { 


    public List<? extends IField> getFields(); 

    } 



public class Form { 
    private List<Field> fields; 


    List<? extends Field> getFields() { // package visible - please note "extends Field" not "extends IField" 
    return this.fields; 

    } 

} 

現在的寵愛之下工作

IForm form; 
    List<IField> list = form.getFields(); 

// by class - from other classes in the same package 
    Form form2; 
    List<Field> list2 = forms2.getFields();