추상 클래스에서 일반 형식 메서드 상속 — 특정 형식으로 변환
-
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
}
}
메소드 선언에서 List에 유형 매개변수로 제공하려는 유형과 슈퍼 클래스를 바인딩해야 합니다.
이와 비슷한 것은 어떨까요?
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