假设我有一个简单的类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类中的泛型,但我不太清楚如何做到这一点。有什么帮助吗?
由于
答案 0 :(得分:5)
你不能,如果你保留他们现在的样子。
就ListR
所知,它包含Object
个,Object
s不包含任何特定信息。他们有一个方法toString
,您可以覆盖,但不建议将其用于演示目的。
如果您允许更改一些内容,您可以做的是强制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;
}
}
}
如果您不希望/无法更改产品的实现,或者您希望实现更灵活的打印方式,则可以使用外部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());