简体   繁体   English

(java.lang.String)不能应用于(java.lang.Object)

[英](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 我有一个名为TopicS的Listner类,我试图从名为readMessages的gui中调用它

When Im trying to run the class TopicS using the following method, 当我尝试使用以下方法运行类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());
}                 

It gives me error saying 它给了我错误的说法

addTopicListner(java.lang.String) in Topics Cannot be applied to (java.lang.Object) 主题中的addTopicListner(java.lang.String)无法应用于(java.lang.Object)

When I change the String to Object I get other errors. 当我将String更改为Object时,我得到其他错误。 The main method is included below, this works fine without GUI, but I need to add it to GUI. 下面包含主要方法,没有GUI就可以正常工作,但我需要将其添加到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 我想要做的是取值为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();
  }
 }
}

JComboBox.getSelectedItem() returns type Object , not String . JComboBox.getSelectedItem()返回Object类型,而不是String You can call toString() on its result to return the string representation of your object. 您可以在其结果上调用toString()以返回对象的字符串表示形式。 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. 看起来好像你正在尝试返回一种Topic ,这意味着你需要覆盖Topic上的toString()方法来返回你想要的值。

That's because JComboBox.html.getSelectedItem() returns Object 那是因为JComboBox.html.getSelectedItem()返回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: 如果你100%确定你的组合框的内容是字符串你只需要施放它:

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. 如您所见,即使它 String对象,最后一次调用( workWithString(o) )也不会编译。 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 ). 事实证明,编译器只知道o被声明为Object但它无法知道该对象是字符串还是其他东西(例如Date )。

I hope this helps. 我希望这有帮助。

Try the following code 请尝试以下代码

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

This is a temporary fix, because I don't know if the incoming getSelectedItem() is a String . 这是一个临时修复,因为我不知道传入的getSelectedItem()是否是一个String
If you know it always will be just cast it 如果你知道它总是会被施展

(String)topicCombobox.getSelectedItem()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.Object []无法转换为java.lang.String [] - java.lang.Object[] cannot be converted to java.lang.String[] 如何解决此错误java.lang.Object []无法转换为java.lang.String []? - How would i fix this Error java.lang.Object[] cannot be cast to java.lang.String[]? ClassCastException:java.lang.Object []无法强制转换为java.lang.String [] android - ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[] android ClassCastException:java.lang.Object []无法转换为java.lang.String [] [] - ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[][] 不兼容的类型:java.lang.Object无法转换为java.lang.String - incompatible types: java.lang.Object cannot be converted to java.lang.String AsyncTask:ClassCastException:java.lang.Object []无法强制转换为java.lang.String [] - AsyncTask: ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[] 不兼容的类型:java.lang.Object无法转换为java.lang.String吗? - incompatible types: java.lang.Object cannot be converted to java.lang.String? android ArrayMap引发java.lang.ClassCastException:无法将java.lang.String强制转换为java.lang.Object [] - android ArrayMap throws java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[] 运算符“ &lt;”不能应用于“ java.lang.String” - Operator '<' cannot be applied to 'java.lang.String' Java.lang.long无法应用于java.lang.string吗? - Java.lang.long cannot be applied to java.lang.string?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM