(java.lang.string) no se puede aplicar a (java.lang.object)
-
29-10-2019 - |
Pregunta
He llamado una clase de Listner Temas Estoy tratando de llamarlo desde una GUI llamada ReadMessages
Cuando intento ejecutar los temas de clase usando el siguiente método,
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());
}
Me da un error al decir
AddTopyListner (java.lang.string) en temas no se puede aplicar a (java.lang.object)
Cuando cambio la cadena a objeto, obtengo otros errores. El método principal se incluye a continuación, esto funciona bien sin GUI, pero necesito agregarlo a la GUI. Lo que estoy tratando de hacer es tomar valor a Combobox, que es una matriz de cadenas, y colocar esa cadena en el tema (donde (t) está ahora ahora
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();
}
}
}
Solución
Eso es porque JComboBox.html.getSelectedItem () Devuelve objeto
public Object getSelectedItem()
Y tu método espera una cadena
public void addTopicToListner(String t)
Si está 100% seguro de que el contenido de su comboBox está en cadena, solo tiene que lanzarlo:
a.addTopicToListner( (String) topicCombobox.getSelectedItem());
Y eso es.
Esta muestra de código reproduce exactamente su error de compilación:
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 );
}
}
Producción:
StringAndObject.java:19: workWithString(java.lang.String) in StringAndObject cannot be applied to (java.lang.Object)
workWithString( o );
^
1 error
Como puede ver, la última llamada (workWithString(o)
) no se compila a pesar de que es un objeto de cadena. Resulta que el compilador solo sabe que o
fue declarado como Object
Pero no tiene una forma de saber si ese objeto es una cadena o es otra cosa (un Date
por ejemplo ).
Espero que esto ayude.
Otros consejos
JComboBox.getSelectedItem()
Tipo de devolución Object
, no String
. Puedes llamar toString()
en su resultado para devolver la representación de cadena de su objeto. Parece que está tratando de devolver un tipo de Topic
, lo que significa que deberá anular el toString()
método sobre Topic
Para devolver el valor que desea.
Prueba el siguiente código
topicCombobox.getSelectedItem() instanceof String ? (String)topicCombobox.getSelectedItem() : "Socks";
Esta es una solución temporal, porque no sé si el entrante getSelectedItem()
es un String
.
Si sabes que siempre lo lanzará
(String)topicCombobox.getSelectedItem()