وراثة الطريقة المكتوبة العامة من فئة مجردة-تحويل إلى نوع معين

StackOverflow https://stackoverflow.com//questions/12716589

سؤال

(العمل في جاوة) لدي فئة مجردة مع الكتابة العامة في جميع أنحاء الطبقة بأكملها:

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, ، (باستخدام إيد) ، فإنه سيتم إنشاء التعليمات البرمجية على النحو التالي:

@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";
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top