(java.lang.String) не может быть применен к (java.lang.Object) - PullRequest
6 голосов
/ 23 марта 2011

Ive класс Listner с именем TopicS Я пытаюсь вызвать его из графического интерфейса readMessages

Когда я пытаюсь запустить класс TopicS с помощью следующего метода,

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

Это дает мне сообщение об ошибке

addTopicListner (java.lang.String) в темах. Не может применяться к (java.lang.Object)

Когда я изменяюСтрока для объекта Я получаю другие ошибки.Основной метод включен ниже, он прекрасно работает без графического интерфейса, но мне нужно добавить его в графический интерфейс.То, что я пытаюсь сделать, это взять значение в выпадающий список, который является массивом String, и поместить эту строку в тему (где (t) теперь

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

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

JComboBox.getSelectedItem() возвращает тип Object, а не String.Вы можете вызвать toString() для его результата, чтобы вернуть строковое представление вашего объекта.Похоже, вы пытаетесь вернуть тип Topic, что означает, что вам нужно переопределить метод toString() для Topic, чтобы вернуть желаемое значение.

1 голос
/ 23 марта 2011

Это потому, что JComboBox.html.getSelectedItem () возвращает объект

public Object getSelectedItem()

И ваш метод ожидает строку

public void addTopicToListner(String t)

Если вы на 100%убедитесь, что содержимое вашего комбинированного списка является строкой, вам просто нужно привести его:

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

И это все.

Этот пример кода воспроизводит именно вашу ошибку компиляции:

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

    }

}

Вывод:

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

Как видите, последний вызов (workWithString(o)) не компилируется, даже если он является объектом String.Оказывается, компилятор знает только, что o был объявлен как Object, но у него нет способа узнать, является ли этот объект строкой или чем-то другим (например, Date).

Надеюсь, это поможет.

0 голосов
/ 23 марта 2011

Попробуйте следующий код

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

Это временное исправление, потому что я не знаю, является ли входящий getSelectedItem() String.
Если вы знаете, что всегда будетпросто брось это

(String)topicCombobox.getSelectedItem()
...