toString使用泛型变量?

时间:2013-12-18 12:21:46

标签: java generics tostring

所以我在这里有这个Bag类,我添加了一个remove(T x)方法,现在我想要打印这个,我知道我必须使用toString()方法但是我一直在使用编译错误或仍然获得对象的哈希码b ...我对此有所解释但仍然无法正常工作,我的解决方案(特定)给了我return bag[i]的错误line:(

class Bag<T> {// generic class with T standing for a class

    private T[] bag =(T[])(new Object[100]);                 
    private int numElements = 0; // junk in bag[numElements..] 

    void add(T x) { // put x in bag
            bag[numElements] = x; numElements++;
    }

    void remove (T x){
        if(x!=null && numElements>0){
            for(int i = 0; i < numElements; i++){
                if(bag[i]==x){
                    bag[i]=bag[numElements];
                    numElements-=1;
                }
            }
        }
    }

    int freq(T x) { // how many x’s in bag?
            int count = 0;
            for (int i=0; i<numElements; i++)
                if (bag[i].equals(x)) // .equals because T a class 
                    count++;
            return count;
    }

    public String toString(){
        for(int i = 0; i < numElements; i++){
            return bag[i];
        }
    }
}

class GenericExample {
    public static void main(String[] args) {        
        Bag<String> b = new Bag<String>();
        b.add("cat"); b.add("dog"); b.add("cat"); 

    }
}

我也尝试输入String.valueOf(bag[i]),但仍然有编译错误......为什么还有问题?在这个例子中,T是一个字符串,所以我无法理解它为什么这样做..

5 个答案:

答案 0 :(得分:4)

您可能希望更改toString方法,如下所示:

public String toString(){
    return Arrays.toString(bag);        
}

或家庭酿造版

public String toString(){
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < numElements; i++){
        sb.append(bag[i]);
    }        
    return sb.toString();
}

如果放入包中的对象没有覆盖toString,那么你会得到一串哈希码。

答案 1 :(得分:2)

如何使用Arrays.toString()

public String toString(){
    return Arrays.toString(bag);
}

答案 2 :(得分:2)

喜欢这个

public String toString(){
    return Arrays.toString(bag);
}

答案 3 :(得分:1)

当需要String时,不能返回Object。

使用return bag[i].toString()

另外

public String toString(){
    for(int i = 0; i < numElements; i++){
        return bag[i];
    }
}

您只能从该功能返回一次。你不能把return语句放在循环中。您可以使用StringBuilder将所有数据附加到循环中,最后调用toString()并从循环外部返回。

答案 4 :(得分:0)

你为什么要多次回来?您是否只想连接所有索引值?

public String toString(){
    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < numElements; i++){
        sb.append(bag[i] + ", ");
    }

    return sb.toString();
}