你不能,如果你保持现在的样子。据ListR
了解,它包含Object
s,而Object
s不包含任何特定信息。他们有一个方法toString
,您可以覆盖它,但不建议将其用于演示目的。
选项 1:内部接口
如果允许您稍作更改,您可以做的是强制ListR
实现接口的内容,例如
public interface Printable {
String printedForm();
}
接着
class Product implements Printable{
//TODO: Whatever you want
@Override
public String printedForm() {
//TODO return a pretty printed form of the product.
//e.g. return this element's name
}
}
class ListR<T extends Printable>{
//...
public void print(){
Node a=first;
while(curr!=null){
//You can now invoke printedForm, because you forced T to implement Printable
System.out.println(a.printedForm());
a=a.next;
}
}
}
选项 2:外部格式化程序
如果您不想/不能更改 Product 的实现,或者如果您想实现更灵活的打印样式,您可以使用外部Formatter
对象,它将格式化您的产品。
//Unmodified
class Product { }
interface ObjectFormatter<T> {
String stringForm(T obj);
}
class ProductFormatter implements ObjectFormatter<Product> {
@Override
public String stringForm(Product obj) {
//TODO return product name or whatever you want
}
}
class ListR<T> {
private final ProductFormatter<? super T> fmt;
public ListR(ProductFormatter<? super T> formatter) {
this.fmt = formatter;
}
//...
public void print(){
Node a=first;
while(curr!=null){
System.out.println(fmt.stringForm(a.elem));
a=a.next;
}
}
}
然后,当您创建列表时:
ListR<Product> list = new ListR<>(new ProductFormatter());