[英](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.