-3

假设我有一个简单的类产品:

class Product{
    private String name;
    //constructor
    //get name method
}

还有一个在 Java 中实际使用泛型的类:

class ListR<t>{
      //more coding here...
      public void print(){
          Node a=first;
          while(curr!=null){
               System.out.println(a.elem); //prints the value of a node
               a=a.next;
      }
}

因此,如果我在主程序中列出 Products 对象,如下所示:

ListR<Product> list=new ListR<>();
Product p1=new Product("books);
//...
list.add(p1)...
list.print();

我怎样才能让我的 print 方法打印存储的产品的名称,我尝试在 print 方法中使用 A 类中的泛型,但我不太确定该怎么做。有什么帮助吗?

谢谢

4

1 回答 1

5

你不能,如果你保持现在的样子。据ListR了解,它包含Objects,而Objects不包含任何特定信息。他们有一个方法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());
于 2013-10-27T01:33:13.213 回答