2013-04-29 3 views
0

Я разрабатываю приложение для Android для подключения к серверу. У меня возникли проблемы с ошибками, точно такое же приложение отлично работает с java swing на стандартном ПК. Точная ошибка E/AndroidRuntime (1257): java.lang.ClassCastException: net.rc.packet.incoming.lister.PServerList не может быть приведен к net.rc.packet.Packet Это мой класс PServerListAndroid java.lang.ClassCastException с сокетом

package net.rc.packet.incoming.lister; 
import java.util.List; 
import net.rc.entity.ServerDescription; 
import net.rc.packet.incoming.ServerPacket; 
public class PServerList implements ServerPacket { 
    public List <ServerDescription> server_descriptions; 
    public PServerList(List <ServerDescription> server_descriptions) { 
     this.server_descriptions = server_descriptions; 
    } 
    public String toString() { 
      StringBuilder string_builder = new StringBuilder(); 
      string_builder.append("["); 
      for (ServerDescription server_description: server_descriptions) { 
       string_builder.append(server_description); 
       string_builder.append(", "); 
      } 
      string_builder.append("]"); 
      return string_builder.toString(); 
     } 
    } 
} 

А вот мой socketprocessor класс

package net.rc.socket; 
import java.util.List; 
import java.util.Queue; 
import java.util.concurrent.LinkedBlockingQueue; 
import javax.inject.Inject; 
import net.rc.packet.Packet; 
import net.rc.socket.processor.PacketProcessor; 
public class SocketProcessor { @ Inject 
    public SocketProcessor(List <PacketProcessor> all_processors) { 
     this.all_processors = all_processors; 
    } 
    private final List <PacketProcessor> all_processors; 
    private final Queue <Byte> buffer = new LinkedBlockingQueue <Byte>(); 
    private PacketProcessor active_processor = null; 
    public void accept(byte[] bytes) { 
     for (int i = 0; i < bytes.length; i++) { 
      buffer.offer(bytes[i]); 
     } 
    } 

    public boolean isComplete() { 
     while (!buffer.isEmpty()) { 
      if (active_processor == null) { 
       int packet_code = (buffer.peek() - 32) & 0xFF; 
       for (PacketProcessor processor: all_processors) { 
        if (processor.handles(packet_code)) { 
         active_processor = processor; 
         break; 
        } 
       } 
      } else { 
       if (active_processor.isSegmentDone() && !active_processor.isComplete()) { 
        active_processor = null; 
        continue; 
       } 
      } 
      if (active_processor.isComplete()) { 
       return true; 
      } 
      active_processor.accept(buffer.poll()); 
     } 
     if (active_processor == null) { 
      return false; 
     } else { 
      return active_processor.isComplete(); 
     } 
    } 

    public < T extends Packet > T getPacket() { 
     if (!isComplete()) return null; 
     T packet = active_processor.getPacket(); 
     active_processor = null; 
     return packet; 
    } 

    public boolean isEmpty() { 
     return buffer.isEmpty(); 
    } 
} 

Любые идеи? Я застрял. Вот LogCat

E/AndroidRuntime(1257): java.lang.ClassCastException: net.rc.packet.incoming.lister.PServerList cannot be cast to net.rc.packet.Packet 
E/AndroidRuntime(1257): at net.rc.socket.SocketProcessor.getPacket(SocketProcessor.java:70) 
E/AndroidRuntime(1257): at net.rc.packet.DefaultPacketServer.receive(DefaultPacketServer.java:40) 
E/AndroidRuntime(1257): at net.rc.RemoteControlHandler.run(RemoteControlHandler.java:23) 
E/AndroidRuntime(1257): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
E/AndroidRuntime(1257): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
E/AndroidRuntime(1257): at java.lang.Thread.run(Thread.java:856) 
+0

stacktrace от logcat пожалуйста? –

+0

Отредактировано и добавлено. –

+0

который является строкой SocketProcessor.java:70? –

ответ

0
public < T extends Packet > T getPacket() { 
    if (!isComplete()) return null; 
    T packet = active_processor.getPacket(); 
    active_processor = null; 
    return packet; 
} 

Extends, использовали этот путь, не означает, что T является Packet. Вместо этого вы можете использовать instanceOf.

+0

Конечно, это означает, что это «есть-пакет». -1 – EJP

+0

Нет, это не так. Посмотри снова. PServerList нельзя отбрасывать в net.rc.packet.Packet. Таким образом, этот метод получает PServerList как пакет. И компилятор говорит, что это «is-not» Packet. –

+0

Так что я должен сделать что-то вроде if (! T instanceof packet) return; ? Извините, что часами бодрствовал, пытаясь исправить это, медленно засыпая. –

Смежные вопросы