6 Stimmen

(java.lang.String) kann nicht auf (java.lang.Object) angewendet werden

Ich habe eine Listner-Klasse namens ThemaS Ich versuche, es von einem gui namens readMessages aufrufen

Wenn ich versuche, die Klasse TopicS mit der folgenden Methode auszuführen,

   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    System.out.println("test test test"); 
    System.out.print("you pressed" +topicCombobox.getSelectedItem());
    TopicS a = new TopicS();
    a.addTopicToListner(topicCombobox.getSelectedItem());
}                 

Ich erhalte die Fehlermeldung

addTopicListner(java.lang.String) in Topics Kann nicht angewendet werden auf (java.lang.Object)

Wenn ich den String in Object ändere, erhalte ich andere Fehler. Die Hauptmethode ist unten enthalten, dies funktioniert gut ohne GUI, aber ich muss es zu GUI hinzufügen. Was ich versuche zu tun ist, nehmen Wert zu Combobox, die String-Array ist, und legen Sie diese Zeichenfolge in Thema (wo die (t) ist jetzt

 import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class TopicS implements MessageListener
{

 private TopicConnection topicConnection;
 private TopicSession topicSession;
 public Topic topic;
 private TopicSubscriber topicSubscriber;

 public TopicS()
            {}
            public void addTopicToListner(String t){
  try
  {
   // create a JNDI context
   Hashtable properties = new Hashtable();
   properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.exolab.jms.jndi.InitialContextFactory");
   properties.put(Context.PROVIDER_URL,"rmi://localhost:1099/");
   Context context = new InitialContext(properties);

   // retrieve topic connection factory
   TopicConnectionFactory topicConnectionFactory = 
       (TopicConnectionFactory)context.lookup("JmsTopicConnectionFactory");
   // create a topic connection
   topicConnection = topicConnectionFactory.createTopicConnection();

   // create a topic session
   // set transactions to false and set auto acknowledgement of receipt of messages
   topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);

   // retrieve topic
   topic = (Topic) context.lookup(t);

   // create a topic subscriber and associate to the retrieved topic
   topicSubscriber = topicSession.createSubscriber(topic);

   // associate message listener
   topicSubscriber.setMessageListener(this);

   // start delivery of incoming messages
   topicConnection.start();
  }
  catch (NamingException e)
  {
   e.printStackTrace();
  }
  catch (JMSException e)
  {
   e.printStackTrace();
  }
 } 

/* public static void main(String[] args)
 //{

  try
  {
   TopicS listener = new TopicS();
   Thread.currentThread().sleep(2000);
  }

  catch (InterruptedException e)
  {
   e.printStackTrace();
  }
 }
 */
 // process incoming topic messages
 public void onMessage(Message message)
 {
  try
  {
   String messageText = null;
   if (message instanceof TextMessage)
    messageText = ((TextMessage)message).getText();
   System.out.println(messageText);
  }
  catch (JMSException e)
  {
   e.printStackTrace();
  }
 }
}

2voto

Mike Yockey Punkte 4565

JComboBox.getSelectedItem() Rückgabetyp Object , nicht String . Sie können anrufen toString() auf sein Ergebnis, um die String-Repräsentation Ihres Objekts zurückzugeben. Es sieht so aus, als ob Sie versuchen, einen Typ von Topic was bedeutet, dass Sie die Funktion toString() Methode auf Topic um den gewünschten Wert zurückzugeben.

1voto

OscarRyz Punkte 189898

Das liegt daran, dass JComboBox.html.getSelectedItem() gibt Objekt zurück

public Object getSelectedItem()

Und Ihre Methode erwartet eine Zeichenkette

public void addTopicToListner(String t)

Wenn Sie 100 % sicher sind, dass der Inhalt Ihrer Combobox eine Zeichenkette ist, müssen Sie sie nur werfen:

a.addTopicToListner( (String) topicCombobox.getSelectedItem());

Und das war's.

Dieses Codebeispiel reproduziert genau Ihren Kompilierungsfehler:

class StringAndObject {
    public void workWithString( String s ) {} // We just care about 
    public void workWithObject( Object o ) {} // the signature. 

    public void run() {

        String s = ""; // s declared as String
        Object o = s;  // o declared as Object

        // works because a String is also an Object
        workWithObject( s );
        // naturally a s is and String
        workWithString( s );

        // works because o is an Object
        workWithObject( o );
        // compiler error.... 
        workWithString( o );

    }

}

Ausgabe:

StringAndObject.java:19: workWithString(java.lang.String) in StringAndObject cannot be applied to (java.lang.Object)
        workWithString( o );
        ^
1 error   

Wie Sie sehen, ist der letzte Aufruf ( workWithString(o) ) lässt sich nicht kompilieren, obwohl es です ein String-Objekt. Es stellt sich heraus, dass der Compiler nur weiß, dass o wurde erklärt als Object aber es hat keine Möglichkeit zu wissen, ob dieses Objekt eine Zeichenkette oder etwas anderes ist (eine Date zum Beispiel).

Ich hoffe, das hilft.

0voto

dseibert Punkte 1251

Versuchen Sie den folgenden Code

topicCombobox.getSelectedItem() instanceof String ? (String)topicCombobox.getSelectedItem() : "Socks";

Dies ist eine vorübergehende Lösung, denn ich weiß nicht, ob die eingehenden getSelectedItem() ist eine String .
Wenn du weißt, dass es immer so sein wird, wirf es einfach

(String)topicCombobox.getSelectedItem()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X