несовместимые типы: объект не может быть преобразован в ChatData

#java #sockets

#java #розетки

Вопрос:

Я новичок в JAVA и пытался обменять объекты между клиентом и сервером с помощью readObject(), но это было показано incompatible types : object cannot be converted to ChatData . Почему произошла ошибка и как ее устранить. Пожалуйста, скажите мне, как это работает.

   ` Socket socket = new Socket("127.0.0.1", 3000);
    ObjectOutputStream clientWriter;
    ObjectInputStream clientReader;
    try {
        clientWriter = new ObjectOutputStream(socket.getOutputStream());
        clientReader = new ObjectInputStream(socket.getInputStream());

        ChatData clientOutputData = new ChatData("Hello! This is a message from the client number ", socket.getInetAddress());
        clientWriter.writeObject(clientOutputData);

        ChatData clientInputData = clientReader.readObject(); //Here is the error and the ChatData is another class.

        try {
            // do processing
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, null, ex);
        }

    } catch (IOException ex) {
        Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            if (clientReader != null) {
                clientReader.close();
            }
            if (clientWriter != null) {
                clientWriter.close();
            }
            socket.close();
        } catch (IOException ex) {
            System.err.println("Couldn't close the connection succesfully");
            Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    Thread.sleep(15000);
    }
 } 
 

Комментарии:

1. работает ли его приведение ChatData ? ChatData clientInputData = (ChatData)clientReader.readObject();

2. Да, это сработало. Но почему это необходимо для его приведения?

3. поскольку java является статическим, строго типизированным языком программирования, поэтому неявное приведение (то, что вы делали) является большим недостатком для компилятора.

Ответ №1:

Метод readObject() возвращает объект типа object.

Вы должны преобразовать полученный объект в нужный вам тип.

 ChatData clientInputData = clientReader.readObject(); //Here is the error and the ChatData is another class.
 

Решение:

 ChatData clientInputData = (ChatData) clientReader.readObject();
 

Вы также должны проверить, относится ли полученный объект к тому типу, который вы хотите, в противном случае может быть вызвано исключение ClassCastException.

 Object clientInputData = clientReader.readObject();
ChatData convertedChatData = null;
if(clientInputData instanceof ChatData) {
    convertedChatData = (ChatData) clientInputData;
}
 

Ответ №2:

Вы должны readObject() явно привести результат к нужному классу, поскольку возвращаемый тип readObject Object :

 ChatData clientInputData = (ChatData) clientReader.readObject();
 

Также вы можете обернуть его в try-catch блок, в таком случае вы сможете обработать ClassCastException ошибку:

 try {
    ChatData clientInputData = (ChatData) clientReader.readObject();
} catch (ClassCastException e){
    //handle error
}
 

И еще один совет: используйте IDE, такую как Intellij IDEA или Eclipse, они предупредят вас об этом перед компиляцией.