وراثة الطريقة المكتوبة العامة من فئة مجردة-تحويل إلى نوع معين
-
13-12-2019 - |
سؤال
(العمل في جاوة) لدي فئة مجردة مع الكتابة العامة في جميع أنحاء الطبقة بأكملها:
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";
}
}