使用泛型的多个toString()方法

时间:2011-10-03 01:18:29

标签: java generics tostring

我有一个对象,它将存储在两个不同的数据结构中。

我正在使用泛型,每个结构都必须以不同的方式打印出对象。有没有办法让多个toString()方法相应调用?

我不能创建两个返回字符串的不同方法,因为自定义方法没有在泛型类型中定义,所以除非你强制转换它,否则你不能调用它们,这打破了泛型背后的点。

我是否应该为每个数据结构创建两个具有不同toString()方法的不同对象?还是有替代方案吗?

由于

2 个答案:

答案 0 :(得分:2)

我认为您需要使用不同对象的toString(),但您仍然可以使用泛型来完成此操作。

我想你的泛型类至少有一个泛型类型的实例。如果是这种情况,请覆盖通用类toString()以委托给泛型类型对象实例。

如果您的泛型类只有一个实例,您可以这样做:

class Holder<T> {
    private T instance;

    public Holder(T _instance) {
        instance = _instance;
    }

    public String toString() {
        return instance.toString();
    }
}

如果您的类有多个泛型类型的实例(与许多Collection一样),您可以委托给该类型的每个实例。

class CollectionHolder<T> {
    private Collection<T> collection;

    public CollectionHolder(Collection<T> _collection) {
        collection= _collection;
    }

    public String toString() {
        StringBuilder builder = new StringBuilder();
        for(T t : collection) {
            builder.append(t); //same as builder.append(t.toString())
        }
        return builder.toString();
    }
}

答案 1 :(得分:1)

如果您需要同时调用它,则需要将其添加到界面中。完全有可能你不想为它使用toString(),因为toString()应该是一个人类可读的表示。

class Nay1 {

    String someCrazyMethod() { return "ugh"; }
}

class Nay2 {

    String someRandomMethod() { return "ook"; }
}

这很糟糕。你不会想要一个Nay1,或者一个Nay2来呃。但你需要统一的东西!

接口NayInterface {

String nayRepresentation();

}

你的新课程:

class Nay1 implements NayInterface  {

    String someCrazyMethod() { return "ugh"; }

    public String nayRepresentation() { return someCrazyMethod(); }
}

class Nay2 implements NayInterface {

    String someRandomMethod() { return "ook"; }

    public String nayRepresentation() { return someRandomMethod(); }
}

现在无论如何,你可以调用myNayInterface.nayRepresentation();来获得与相应类相匹配的字符串表示,而不进行任何转换。

class ActuallyDoesSomething<T extends NayInterface> {

    String foo;

    public ActuallyDoesSomething(T t) {
        this.foo = t.nayRepresentation();
    }

    public String foo() { return foo; }

}

显然,如果你想使用toString()而不是nayRepresentation,你可以这样做。但是这将允许您不必使用toString并保留它以用于调试目的。