toString
中的Java
方法存在问题。这是故障......我有一个我正在查询的数据库。查询返回数据库中的所有成员,我想将这些成员作为字符串返回。这是我到目前为止所做的。
在Member class
我有以下
@Override
public String toString()
{
return this.login_name + " (" + this.lastName + ", " + this.firstName + ")";
}
现在,为了从数据库中获取成员并将它们作为字符串数组返回,这就是我所拥有的:
/**
* Accessor used to get all of the user names contained in the underlying
* database.
* @return String[] user_names - The names of all the users in the data base.
* @throws MemberNotFoundSignal
*/
public String[] getMembers() throws MemberNotFoundSignal
{
List<Member> members = Arrays.asList(this.rscMgr.getAllMembers());
String[] user_names = new String[members.size()];
for (int i = 0; i < members.size(); i++)
{
user_names[i] = members.get(i).toString();
}
return user_names;
}
在运行时members.get(i).toString()
应该从Member类调用toString方法(我错了)?如果我不是,为什么要调用对象toString方法呢?我的理解是,通过将数组转换为List,它将使用Member的toString方法(因为泛型)。
我正在使用以下代码:
String[] user_names = this.model.getMembers();
this.memberInput = new JComboBox(user_names);
当我在getMembers
函数上设置断点时,'user_names'不包含我期望的字符串的覆盖版本,而是包含对象的默认返回类型。
members.get(i).toString();
不会调用重写的toString方法,而是调用对象实现。
答案 0 :(得分:1)
根据我们的聊天情况,我们确定您的JAR工件未正确更新。我们通过在调试器中评估以下内容,确定从正确的位置加载了Member
:
Member.class.getProtectionDomain().getCodeSource()
但是当使用反射来检查Member
声明的方法时,我们可以看到toString()
方法不存在:
Member.class.getDeclaredMethods()
因此我们推测JAR已过时,您通过检查部署站点上JAR的时间戳来确认。
答案 1 :(得分:0)
您不需要让ArrayList来调用成员对象的toString()
。您可以在迭代数组时调用toString()
。看一下以下内容。
public String[] getMembers(){
Member members = this.rscMgr.getAllMembers();
String userNames[] = new String[members.length];
for(int i=0; i<members.length; i++){
usersNames[i] = member[i].toString();
}
}
答案 2 :(得分:0)
在运行时,members.get(i).toString()应该从Member&gt;类调用toString方法(我错了)?如果我不是,为什么要调用对象toString方法呢? &gt;我的理解是,通过将数组转换为List,它将使用Member的&gt; toString方法(因为泛型)。
请记住,泛型只是编译时间并通过擦除来实现。你不能用它来投射物体。我猜你的rscMgr.getAllMembers()
会返回Member
以外的内容。尝试类似:
int count=0;
for (Member m: rsc.getAllMembers()){
usersNames[count++] = m.toString();
}