从抽象类继承泛型类型化方法-转换为特定类型
-
13-12-2019 - |
题
(在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)
但这不符合复盖的要求 processPage
从 ConnectionProcessor
.这是为什么?我怎样才能得到所需的行为?我会认为在 AlbumProcessor
我可以插上电源 <Album>
到处都是 ConnectionProcessor
有 <T>
, ,但事实并非如此。
解决方案
试试
//extend prameterized version of ConnectionProcessor<T> with Album as actual type argument
public class AlbumProcessor extends ConnectionProcessor<Album> {
而不是
public class AlbumProcessor<Album> extends ConnectionProcessor {
当您执行上述操作时,您正在扩展泛型类型的原始版本 ConnectionProcessor<T>
并引入一个新的正式类型参数 - Album
(像 T
在这种情况下,它不是一个实际的类型参数。
其他提示
那是因为你没有绑定你的超级类泛型类型 T
到 Album
.
相反,这是你应该做的:
public class AlbumProcessor extends ConnectionProcessor<Album>
所以,当你复盖你的方法 processPage
, ,(使用IDE),它将生成代码如下:
@Override
protected void processPage(List<Album> resultsPage)
{
//Do stuff here specific to Album
}
public class AlbumProcessor extends ConnectionProcessor<Album>
试试:-
public class AlbumProcessor extends ConnectionProcessor<Album>
{
@Override
protected void processPage(List<Album> resultsPage)
{
//Do stuff here specific to Album
}
}
您需要将您的超级类与您想要作为类型参数给出的类型绑定到您的方法声明中的列表。.
再来点这样的怎么样。
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";
}
}
不隶属于 StackOverflow