문제

(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";
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top