2012-10-03 27 views
1

(在Java中工作) 我在整個類通用輸入一個抽象類:傳承 - 轉換成特定類型的

public abstract class ConnectionProcessor<T> 
{ 
    public void process() 
    { 
     for (List<T> resultsPage : connection) 
     { 
      processPage(resultsPage); 
     } 
    } 

    protected abstract void processPage(List<T> resultsPage); 
} 

我曾經說過,擴展另一個類抽象類,具有以下聲明:

public class AlbumProcessor<Album> extends ConnectionProcessor 
{ 
    @Override 
    protected void processPage(List resultsPage) 
    { 
     //Do stuff here specific to Album 
    } 
} 

這個宣言工作正常,但在processPage我想做Album特異性的事情,我會盡量避免鑄造時,我並不需要使用它。我寧願這是方法聲明:

protected void processPage(List<Album> resultsPage) 

但是,這並不符合從ConnectionProcessor覆蓋processPage的要求。爲什麼是這樣?我怎樣才能獲得理想的行爲?我會認爲在AlbumProcessor我可以隨時插入<Album>ConnectionProcessor<T>,但事實並非如此。

回答

2

嘗試

//extend prameterized version of ConnectionProcessor<T> with Album as actual type argument 
public class AlbumProcessor extends ConnectionProcessor<Album> { 

,而不是

public class AlbumProcessor<Album> extends ConnectionProcessor { 

當你做你上面的exteding泛型類型ConnectionProcessor<T>的原始版本,並引入新的形式類型參數 - Album(如T)這是不是在這種情況下,實際類型參數。

+0

感謝所有4,我認爲你回答了我的「爲什麼是這個」問題的最好部分 – Indigenuity

+0

@Indigenuity:不客氣。 –

1
public class AlbumProcessor extends ConnectionProcessor<Album> 
+0

+1希望我能接受這些正確答案的所有4 XD – Indigenuity

1

嘗試: -

public class AlbumProcessor extends ConnectionProcessor<Album> 
{ 
    @Override 
    protected void processPage(List<Album> resultsPage) 
    { 
     //Do stuff here specific to Album 
    } 
} 

你需要你的超級類你想給一個類型參數在方法聲明列表中的類型綁定..

+0

+1希望我能接受這些正確答案的所有4 XD – Indigenuity

2

這是因爲您沒有將您的超類通用類型T綁定到Album

更確切地說,這是你應該做的:

public class AlbumProcessor extends ConnectionProcessor<Album> 

所以,當你重寫你的方法processPage,(使用IDE),它會如下生成代碼:

@Override 
protected void processPage(List<Album> resultsPage) 
{ 
    //Do stuff here specific to Album 
} 
+0

+1希望我能接受這些正確答案XD – Indigenuity

1

怎麼回事更像這樣。

import java.util.List; 

public abstract class ConnectionProcessor<T> 
{ 
    public void process() 
    { 
     System.out.println("Hello"); 
    } 

    protected abstract void processPage(List<? extends T> resultsPage); 
} 

...

public class ProcessorImpl extends ConnectionProcessor<Album> { 

    protected void processPage(List<? extends Album> resultsPage) { 
     for(Album result : resultsPage){ 
      System.out.println(result.getAlbumName()); 
     } 
    } 

} 

...

public class Album { 
    public String getAlbumName(){ 
     return "Sweet Smooth SOunds of the 70's"; 
    } 
}