(java.lang.String) ne peut pas être appliqué à (java.lang.Object)
-
29-10-2019 - |
Question
J'ai une classe Listner appelée TopicS J'essaie de l'appeler à partir d'une interface graphique appelée readMessages
Lorsque j'essaye d'exécuter la classe TopicS en utilisant la méthode suivante,
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());
}
Cela me donne une erreur en disant
addTopicListner (java.lang.String) dans les rubriques Ne peut pas être appliqué à (java.lang.Object)
Lorsque je change la chaîne en objet, j'obtiens d'autres erreurs.La méthode principale est incluse ci-dessous, cela fonctionne bien sans GUI, mais je dois l'ajouter à GUI.Ce que j'essaie de faire, c'est de valoriser la zone de liste déroulante qui est un tableau de chaînes, et de placer cette chaîne dans le sujet (où le (t) est maintenant
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();
}
}
}
La solution
C'est parce que JComboBox.html.getSelectedItem () renvoie Object
public Object getSelectedItem()
Et votre méthode attend une chaîne
public void addTopicToListner(String t)
Si vous êtes sûr à 100% que le contenu de votre combobox est une chaîne, il vous suffit de le lancer:
a.addTopicToListner( (String) topicCombobox.getSelectedItem());
Et c'est tout.
Cet exemple de code reproduit exactement votre erreur de compilation:
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 );
}
}
Sortie:
StringAndObject.java:19: workWithString(java.lang.String) in StringAndObject cannot be applied to (java.lang.Object)
workWithString( o );
^
1 error
Comme vous le voyez, le dernier appel (workWithString(o)
) ne se compile pas même s'il est un objet String.Il s'avère que le compilateur sait seulement que o
a été déclaré comme Object
mais il n'a pas de moyen de savoir si cet objet est une chaîne ou est autre chose (un Date
par exemple).
J'espère que cela vous aidera.
Autres conseils
JComboBox.getSelectedItem()
renvoie le type Object
, et non String
.Vous pouvez appeler toString()
sur son résultat pour renvoyer la représentation sous forme de chaîne de votre objet.Il semble que vous essayez de renvoyer un type de Topic
, ce qui signifie que vous devrez remplacer la méthode toString()
sur Topic
pour renvoyer la valeur souhaitée.
Essayez le code suivant
topicCombobox.getSelectedItem() instanceof String ? (String)topicCombobox.getSelectedItem() : "Socks";
Ceci est une solution temporaire, car je ne sais pas si le getSelectedItem()
entrant est un String
.
Si vous savez que ce sera toujours juste de le lancer
(String)topicCombobox.getSelectedItem()