2011-05-31 18 views
24

मेरे पास जावा में यह अजीब (मुझे लगता है) समस्या है। मेरे पास एक ऐरेलिस्ट है और मैं एक उपन्यास लेना चाहता हूं। लेकिन मुझे अनुवर्ती अपवाद मिलता है।जावा में एक वैध उपन्यास कैसे लें?

package javatest; 

import java.util.ArrayList; 

public class JavaTest { 

    public static void main(String[] args) { 
     ArrayList<Integer> alist = new ArrayList<Integer>(); 
     alist.add(10); 
     alist.add(20); 
     alist.add(30); 
     alist.add(40); 
     alist.add(50); 
     alist.add(60); 
     alist.add(70); 
     alist.add(80); 
     ArrayList<Integer> sub = (ArrayList<Integer>) alist.subList(2, 4); 
     for (Integer i : sub) 
      System.out.println(i); 
    } 
} 

रन: सूत्र में अपवाद "मुख्य" java.lang.ClassCastException: java.util.RandomAccessSubList javatest.JavaTest.main (JavaTest पर java.util.ArrayList में ढाला नहीं जा सकता है। जावा: 17) जावा परिणाम: 1

एक उपन्यास लेने का सही तरीका क्या है?

Thx

+1

इंटरफ़ेस सूची पर चिपकाना कार्यान्वयन नहीं है और आप ठीक होंगे। ज़ीरोपेज द्वारा उत्तर की जांच करें। –

उत्तर

23

आप संग्रह के लिए इंटरफेस के साथ काम करना चाहिए जहां भी संभव हो। आप सुस्तवादी के परिणाम को कम कर रहे हैं, लेकिन एपीआई निर्दिष्ट करता है कि यह List (ArrayList) देता है। यहां, कार्यान्वयनकर्ता अपने जीवन को आसान बनाने के लिए एक अलग प्रकार को वापस करने का चयन कर रहे हैं।

एपीआई दस्तावेज फर्टहेमोर निर्दिष्ट करता है कि उपन्यास मूल पर मैप किए गए सूची को वापस कर देगा, इसलिए सावधान रहें!

+5

मुझे उम्मीद है कि फूलिस्ट का एक उपन्यास भी एक फूलिस्ट होगा। मुझे लगता है कि यह सोचने के लिए उचित बात है। वैसे भी thx :) –

8

इस प्रयास करें ...

List<Integer> alist = new ArrayList<Integer>(); 
alist.add(10); 
alist.add(20); 
alist.add(30); 
alist.add(40); 
alist.add(50); 
alist.add(60); 
alist.add(70); 
alist.add(80); 
List<Integer> sub = alist.subList(2, 4); 
for (Integer i : sub) 
    System.out.println(i); 
+1

कलाकार अनावश्यक है। – helpermethod

+0

@ हेल्पर विधि: thanx, निश्चित :) –

3

करने के लिए कोड का प्रयास करें

List<Integer> sub = alist.subList(2, 4); 
0

बदलें:

List<Integer> sub = alist.subList(2, 4); 

sublist() विधि देता है एक List, जो जरूरी एक ArrayList नहीं है (यहां यह वास्तव में RandomAccessSublist है, यही कारण है कि कलाकार विफल रहता है)।

46

के रूप में यह हो जाता है:

List sublist = new ArrayList(); 
sublist = new ArrayList<String>(alist.subList(2, 4)); 

और यह ArrayList के impl पर

+0

अपेक्षित कार्य, धन्यवाद –

+1

यह बहुत गलत है। पहली पंक्ति का बिल्कुल कोई प्रभाव नहीं है। यह एक नई ऐरे सूची बनाता है जो अगली पंक्ति पर अनाथ है जब एक नया ArraysList बनाया गया है। नया ArrayList alist.subList से लौटाए गए मानों के साथ प्रारंभ किया गया है। लेकिन यह alist.subList से बहुत अलग है जिसे सहयोगी द्वारा समर्थित किया जाता है। –

2
public List<E> subList(int fromIndex, int toIndex) { 
    return (this instanceof RandomAccess ? 
      new RandomAccessSubList<E>(this, fromIndex, toIndex) : 
      new SubList<E>(this, fromIndex, toIndex)); 
    } 

की तरह काम करना चाहिए, यह वापसी सूची है, के रूप में @George Kastrinis कहा उपयोग इंटरफ़ेस जहां भी संभव हो।

संबंधित मुद्दे