2013-03-18 71 views
0

我在理解以下情形時遇到了一些麻煩。 我有一個「generified」接口,由抽象類和擴展抽象類的具體類實現。抽象類上實現泛型接口的鬆散列表類型

問題是,抽象類返回參數化列表中的所有方法都失去了它們的類型,所以我得到一個編譯錯誤,告訴我它不能從對象轉換爲原始列表類型。

任何人都可以提供一些見解?

最後我想要的是抽象類上的getId和setId方法返回類型爲java.lang.object<T extends Object>以及具體類將其返回類型實現爲他們想要的任何類型。

這裏是我的不同對象的代碼:

通用接口

public interface MyInterface<T>{ 

    public T getId(); 
    public void setId(T id); 

} 

一個抽象類實現接口

public abstract class MyAbstractClass<T> implements MyInterface<T>{ 

    private List<String> texts; 
    private List<Integer> notes; 

    public List<String> getTexts(){ 
    return texts; 
    } 

    public List<Integer> getNotes(){ 
    return notes; 
    } 
} 

一個具體的類實現抽象類

public class MyConcreteClass implements MyAbstractClass<Integer>{ 

    private Integer id; 

    public Integer getId(){ 
     return this.id; 
    } 


    public void setId(Integer id){ 
      this.id = id; 
    } 

}

一些其他類:

public class SomeOtherClass{ 

    public void process(List<T extends MyAbstractClass> myClassList){ 

    // Compilation error -> 
    // Type mismatch: cannot convert from element type Object to String 
     for(MyAbstractClass myObj : myClassList){ 

      System.out.println("object Id : " + myObj.getId()); 

       // Compilation error -> 
       // Type mismatch: cannot convert from element type Object to String 
      for(String txt : myObj.getTexts()){ 


      } 
     } 
    } 

}

+1

你可能需要'公共無效過程(MyAbstractClass MyClass的){'。注意在參數類型中增加了** **。 – OldCurmudgeon 2013-03-18 10:12:11

+0

是的,但事情是我想要能夠處理我的抽象類的所有子類型,以便調用for循環內的getId()方法。我只是編輯代碼,以更好地顯示我試圖嘗試 – ufasoli 2013-03-18 10:14:40

回答

1

我認爲你需要另一個接口。參見MyAbstractClass實現兩個接口MyInterface<T>, MyOtherInterface

public static interface MyInterface<T> { 
    public T getId(); 

    public void setId(T id); 
    } 

    public static interface MyOtherInterface { 
    public List<String> getTexts(); 

    public List<Integer> getNotes(); 
    } 

    public abstract class MyAbstractClass<T> implements MyInterface<T>, MyOtherInterface { 
    private List<String> texts; 
    private List<Integer> notes; 

    public List<String> getTexts() { 
     return texts; 
    } 

    public List<Integer> getNotes() { 
     return notes; 
    } 
    } 

    public static class MyConcreteClass extends MyAbstractClass<Integer> { 
    private Integer id; 

    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 
    } 

    public class SomeOtherClass { 
    public void process(MyOtherInterface myClass) { 

     // NO Compilation error 
     for (String str : myClass.getTexts()) { 
     // some processing 
     } 
    } 
    } 
+0

這將是幾乎完美的,但我不能在過程方法的foreach循環中調用getId()方法..我開始認爲我是無法做到這一點..我稍微修改了處理方法,以更好地反映我的實際代碼 – ufasoli 2013-03-18 10:33:09

+0

然後,它需要是「MyConcreteClass」或「MyInterface 」,除非你想用它來鑄造它,可怕。 – OldCurmudgeon 2013-03-18 10:37:50

+0

是的,我寧願不使用鑄造,因爲我同意不是很好...我接受你的答案,因爲我認爲是最接近的答案。天哪,我總是被Java擦除愚弄 – ufasoli 2013-03-18 10:40:17

4

當您使用泛型類型MyAbstractClass<T>爲原料型(MyAbstractClass),其成員的聲明都通用的相關的東西被禁用(即List<String>變成List)。

因此,您需要將您的方法的參數聲明爲參數化類型。如果你不關心實際的類型參數,使用通配符:

public void process(MyAbstractClass<?> myClass) { ... }