从Java中的泛型类中获取元素?

时间:2013-10-27 01:09:19

标签: java generics

假设我有一个简单的类Product:

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类中的泛型,但我不太清楚如何做到这一点。有什么帮助吗?

由于

1 个答案:

答案 0 :(得分:5)

你不能,如果你保留他们现在的样子。 就ListR所知,它包含Object个,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:外部格式化程序

如果您不希望/无法更改产品的实现,或者您希望实现更灵活的打印方式,则可以使用外部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());