2011-09-27 19 views
28

मैं कुछ वर्ग कि इंटरफेस के साथ काम करता है:ऑब्जेक्ट्स की सूची को इंटरफेस की सूची में कैसे परिवर्तित करें?

public class Worker 
{ 
    private List<Orderable> workingList; 

    public void setList(List<Orderable> value) {this.workingList=value;} 

    public void changePlaces(Orderable o1,Orderable o2) 
    { 
    // implementation that make o1.order=o2.order and vice versa 
    } 
} 

यहाँ एक उद्देश्य यह है कि इंटरफ़ेस को लागू करता है:

public interface Orderable 
{ 
    int getOrder() 
    void setOrder() 
} 

यहाँ कार्यकर्ता वर्ग है:

यहां इंटरफ़ेस है

public class Cat implements Orderable 
{ 
    private int order; 

    public int getOrder() 
    { 
     return this.order; 
    } 

    public void setOrder(int value) 
    { 
     this.order=value; 
    } 

    public Cat(String name,int order) 
    { 
     this.name=name; 
     this.order=order; 
    } 
} 

मुख्य प्रक्रिया में मैं एक सूची बनाता हूं बिल्लियों का जब सूची बदल जाती है और जब इस सूची के साथ एक नियंत्रण मॉडल बनाया जाता है तो मैं नियंत्रण को गतिशील रूप से अद्यतन करने के लिए glazed lists का उपयोग करता हूं।

लक्ष्य इस सूची को किसी कार्यकर्ता ऑब्जेक्ट में स्थानांतरित करना है, इसलिए मैं मुख्य प्रक्रिया में सूची में कुछ नई बिल्ली जोड़ सकता हूं, और कार्यकर्ता इसकी सूची संपत्ति को फिर से सेट किए बिना इसके बारे में जानेंगे (सूची एक ही वस्तु है मुख्य proc और कार्यकर्ता में)। लेकिन जब मैं worker.setList(cats) पर कॉल करता हूं तो यह ऑर्डर करने योग्य होने की अपेक्षा करता है, लेकिन बिल्ली प्राप्त कर रहा है ... लेकिन बिल्ली ऑर्डर करने योग्य लागू करता है। मैं इसे कैसे हल करूं?

यहां मुख्य कोड है:

void main() 
{ 
    EventList<Cat> cats=new BasicEventList<Cat>(); 

    for (int i=0;i<10;i++) 
    { 
     Cat cat=new Cat("Maroo"+i,i); 
     cats.add(cat); 
    } 

    Worker worker=new Worker(); 
    worker.setList(cats); // wrong! 
    // and other very useful code 
} 

उत्तर

32

आप इतना है कि यह List<? extends Orderable>

public class Worker 
{ 
    private List<? extends Orderable> workingList; 

    public void setList(List<? extends Orderable> value) {this.workingList=value;} 

    public void changePlaces(Orderable o1,Orderable o2) 
    { 
    // implementation that make o1.order=o2.order and vice verca 
    } 
} 
+0

यह दृष्टिकोण मेरे लिए सबसे अच्छा काम करता है क्योंकि मुझे केवल "वर्कर" विधि हस्ताक्षर बदलना है, एक सरणी की घोषणा नहीं, जिसे मैं _all_ में अपनी फाइलों में स्पर्श नहीं करना चाहता था। मैट बॉल की तुलना में आईएमओ एक और व्यवहार्य दृष्टिकोण का सुझाव दिया – Makibo

7

अगर आप सिर्फ cats की घोषणा बदल यह काम करना चाहिए:

List<? extends Orderable> cats = new BasicEventList<? extends Orderable>(); 

for (int i=0; i<10; i++) 
{ 
    cats.add(new Cat("Maroo"+i, i)); 
} 

Worker worker = new Worker(); 
worker.setList(cats); 

देखें:

1
void main() 
{ 
    EventList<Orderable> cats = new BasicEventList<Orderable>(); 

    for (int i=0;i<10;i++) 
    { 
     Cat cat=new Cat("Maroo"+i,i); 
     cats.add(cat); 
    } 

    Worker worker=new Worker(); 
    worker.setList(cats); // should be fine now! 
    // and other very usefull code 
} 

अधिकतर स्वीकार करता है, सिर्फ सही दूर Orderables की सूची का निर्माण Worker वर्ग बदलने की जरूरत है , बिल्ली बिल्ली लागू होने के बाद से ent आदेश योग्य, आप सूची में एक बिल्ली जोड़ने में सक्षम होना चाहिए।

ध्यान दें: इस मुझे जल्दी से अनुमान लगा

4

तुम सच में इंटरफ़ेस प्रकार का एक नया संग्रह चाहते हैं, तो है। उदाहरण के लिए जब आप उन तरीकों का स्वामित्व नहीं रखते हैं जिन्हें आप बुला रहे हैं।

//worker.setList(cats); 
worker.setList(new ArrayList<Orderable>(cats)); //create new collection of interface type based on the elements of the old one 
संबंधित मुद्दे