Java toString问题

时间:2013-11-18 17:23:01

标签: java arrays list generics tostring

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方法,而是调用对象实现。

3 个答案:

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