我有一个对象,它将存储在两个不同的数据结构中。
我正在使用泛型,每个结构都必须以不同的方式打印出对象。有没有办法让多个toString()
方法相应调用?
我不能创建两个返回字符串的不同方法,因为自定义方法没有在泛型类型中定义,所以除非你强制转换它,否则你不能调用它们,这打破了泛型背后的点。
我是否应该为每个数据结构创建两个具有不同toString()
方法的不同对象?还是有替代方案吗?
由于
答案 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并保留它以用于调试目的。