Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

(java.lang.String) cannot be applied to (java.lang.Object)

Ive a Listner class called TopicS Im trying to call it from a gui called readMessages

When Im trying to run the class TopicS using the following method,

   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());
}                 

It gives me error saying

addTopicListner(java.lang.String) in Topics Cannot be applied to (java.lang.Object)

When I change the String to Object I get other errors. The main method is included below, this works fine without GUI, but I need to add it to GUI. What I am trying to do is take value to combobox which is String array, and place that string into topic (where the (t) is now

 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();
  }
 }
}
like image 391
skal Avatar asked Mar 23 '11 19:03

skal


2 Answers

JComboBox.getSelectedItem() returns type Object, not String. You can call toString() on its result to return the string representation of your object. It looks as if you're trying to return a type of Topic, which means you'll need to override the toString() method on Topic to return the value you want.

like image 52
Mike Yockey Avatar answered Oct 26 '22 12:10

Mike Yockey


That's because JComboBox.html.getSelectedItem() returns Object

public Object getSelectedItem()

And your method expects a string

public void addTopicToListner(String t)

If you're 100% sure the contents of your combobox are string you just have to cast it:

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

And that's it.

This code sample reproduces exactly your compilation error:

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 );

    }

}

Output:

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

As you see, the last call (workWithString(o) ) doesn't compile even though it is a String object. It turns out the compiler only knows that o was declared as Object but it doesn't have a way to know if that object is a string or is something else ( a Date for instance ).

I hope this helps.

like image 31
OscarRyz Avatar answered Oct 26 '22 11:10

OscarRyz