Что такое java.lang.ClassCastException: java.util.ArrayList - PullRequest
2 голосов
/ 09 января 2012

Мой код выбрасывает ошибку исключения java.lang.ClassCastException, почему эта ошибка получится ?. Я использую API com.android.internal.telephony. то есть вы можете найти классы, которые я использую здесь Call.java <http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/com/android/internal/telephony/Call.java>, CallManger.java <http://hi-android.info/src/com/android/internal/telephony/CallManager.java.html> Я создал Subclaas of Call.java следующим образом:

    public class MyCall extends Call{   

        CallManager cm = CallManager.getInstance(); 
        Phone.State state;
        Connection c;
         Phone mDefaultPhone;
         private final ArrayList<Connection> emptyConnections = new ArrayList<Connection>();    
         MyCall ringingCall;     

        @Override
        public List<Connection> getConnections() {          
            state = cm.getState();      
            ringingCall = (MyCall) cm.getRingingCalls();
            System.out.println("**inside getConnections="+ringingCall);     
            if ( ringingCall != null && !ringingCall.isIdle()) {
                System.out.println("**call is not null***");
                return ((MyCall) ringingCall).getConnections();
            }      
            else
            {
                System.out.println("**list is  null***");
                return emptyConnections;
            }       
        }

        @Override
        public Phone getPhone() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void hangup() throws CallStateException {
            // TODO Auto-generated method stub

        }

        @Override
        public boolean isMultiparty() {
            // TODO Auto-generated method stub
            return false;
        }

        public Connection
        getEarliestConnection() {
            System.out.println("inside EarliestConnection"); 
            List l;
            long time = Long.MAX_VALUE;
            Connection c;
            Connection earliest = null;

            l = getConnections();

            if (l == null) {
                return null;
            }else if ( l.size() == 0)
            {
                return null;
            }

            System.out.println("value of connection is=="+l); 
            for (int i = 0, s = l.size() ; i < s ; i++) {
                c = (Connection) l.get(i);
                long t;

                t = c.getCreateTime();

                if (t < time) {
                    earliest = c;
                    time = t;
                }
            }

        return earliest;
    }
}

Я назвал CallManger.java так в своем классе

CallManager cm = CallManager.getInstance();

Мой другой класс - CallUpdate, он должен сообщать мне состояния OutgoingCall (то есть другой телефонный номер занят, выключен, недоступен и т. Д.) Код выглядит так:

public class CallUpdate {   

    Call myCall = new MyCall();
    Connection myConn = new MyConnection();
    CallManager cm = CallManager.getInstance();

        public Object getCallFailedString(){

           myConn = myCall.getEarliestConnection();
           System.out.println("myConn is  ******"+myConn);
           System.out.println("myCall is  ******"+myCall);  

           if(myConn == null){
                System.out.println("myConn is null ******");
                return null;
           }                
          else
            {
               Connection.DisconnectCause cause = myConn.getDisconnectCause();                       
               System.out.println("myconn is not null ******"+cause);   


                switch(cause){

                 case BUSY :
                   System.out.println("inside busy");
                 break;

                 case NUMBER_UNREACHABLE :
                    System.out.println("inside un-reachable");
                 break;

                case POWER_OFF :
                   System.out.println("inside power off");
                 break;  
              }
       }
    return myConn;
 }

Я вызвал этот класс в BroadCastReceiver (). Но я получаю связь нулевая. Мой код не попадает внутрь другой части. Так что я добавил некоторый код в метод getConnection класса MyCall следующим образом:

public List<Connection> getConnections() {      


     state = cm.getState();     
     ringingCall = (MyCall) cm.getRingingCalls();
         System.out.println("**inside getConnections="+ringingCall);        
          if ( ringingCall != null && !ringingCall.isIdle()) {
            System.out.println("**call is not null***");
            return ((MyCall) ringingCall).getConnections();
        }      
        else
        {
            System.out.println("**list is  null***");
            return emptyConnections;
        }   
    }

Но я получаю исключение java.lang.ClassCastException: on Line: ringingCall = (MyCall) cm.getRingingCalls(); А также на l = getConnection(); Как решить это ?? Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 09 января 2012

getRingingCalls возвращает List<Call>, т.е. список Call объектов. Вы пытаетесь привести его к одному MyCall вместо List, поэтому вы получаете ClassCastException.

Вам нужно исправить свой тип до List:

List<MyCall> ringingCall;
ringingCall = cm.getRingingCalls();

или используйте первый элемент в списке:

MyCall ringingCall;
if(!cm.getRingingCalls().isEmpty()){
    ringingCall = cm.getRingingCalls().get(0);
}
1 голос
/ 09 января 2012

Измените ваш код, как показано ниже

List<MyCall> ringingCall = cm.getRingingCalls();

Я верю, что ваш cm.getRingingCalls(); вернул ArrayList из Call / MyCall

...