具有返回正确类型的getter的泛型类型的字段?

时间:2014-01-21 15:47:33

标签: java

鉴于以下两个类FooFooBar

public abstract class Foo {
  private String type;
  private int id;

  public String getType() {...}
  public int getId() {...}
}

public class FooBar extends Foo {
  private String extraField;

  public String getExtraField() {...}
}

如何使用可能为FooFooBar的字段实现类?例如,在下面的类Example中,我希望getFoo()方法返回Foo的实例或FooBar的实例,以便所有访问者都可用:< / p>

public class Example {
  private Foo fooField;

  // Not correct!
  public Foo getFooField() {...}
}

我在想我需要将泛型类实现为包装器,但我不确定如何将它绑定到Example类。

public interface FooWrapper<T extends Foo> {
  // Would I define some getter here?
  // Is this the right track?
}

更新:为了澄清,Example 扩展FooExample是一种完全不同的类型,其中包含Foo / FooBar类型的字段。

1 个答案:

答案 0 :(得分:2)

您可以将Example类设为通用:

class Example<T extends Foo> {
    private T fooField;
    public T getFooField() { return fooField;}
}

然后为FooFooBar创建参数化实例:

Example<Foo> fooExample = new Example<Foo>();
Foo foo = fooExample.getFooField();
System.out.println(foo.getId());
System.out.println(foo.getType());

Example<FooBar> fooBarExample = new Example<FooBar>();
FooBar fooBar = fooBarExample.getFooField();
System.out.println(fooBar.getId());
System.out.println(fooBar.getType());
System.out.println(fooBar.getExtraField());