我如何从java中的泛型类继承?

时间:2013-08-12 19:44:16

标签: java generics subclass

我有一个类似下面的课程

public class Foo<idType extends WritableComparable<idType>, EData extends Writable> {
  public Foo();

  public Foo(idType foo; idType bar){
  this.foo = foo;
  this.bar = bar;
  }
  private idType foo;
  private idType bar;

}

现在这个类的一个用法如下:

elist = new ArrayList<Foo<StringType, EmptyType>>();

所以这很好用:

现在我想扩展这个类以添加一个字段

private String foobar;

现在,基本上这个实例将有三个字段。

其中两个

   foobar.foo //base class
   foobar.bar //base class
   foobar.foobar // new variable added

现在,我的用法仍然相同:

 elist = new ArrayList<FooBar<StringType, EmptyType>>();

我尝试了一个简单的扩展程序:

 public class Foobar extends Foo{
 private String foobar;
 public FooBar(String foobar){this.foobar = foobar;}

}

但是当我使用

我收到错误:

 elist = new ArrayList<FooBar<StringType, EmptyType>>();
ArrayList<FooBar><StringType,EmptyType>> cannot be resolved to a type

1 个答案:

答案 0 :(得分:4)

如果您想让用户为您的子类指定类型,请指定相同的类型参数,并将它们传递给基类:

public class FooBar <idType extends WritableComparable<idType>, EData extends Writable>
    extends Foo<idType, EData>
{ 
    ...
}

如果您想让用户只指定其中一种类型,您可以这样做,例如您想强制Integer idType

public class FooBar <EData extends Writable>
    extends Foo<Integer, EData>
{ 
    ...
}

如果您只想使用特定类型作为基础,同样的想法:

public class FooBar
    extends Foo<Integer, Something>
{ 
    ...
}

您甚至可以添加类型:

public class FooBar <idType extends WritableComparable<idType>, EData extends Writable, AnotherType>
    extends Foo<idType, EData>
{ 
    private AnotherType x;
    ...
}

关键是,您可以以任何您认为合适的方式在子类中指定自己的参数类型,只要它们是兼容类型,您就可以将这些类型传递给基类。

编辑:响应上述问题的评论,您必须指定与基础FooBar上的约束匹配的Foo类型参数的约束。例如,以下是不够的:

public class FooBar <idType, EData>
    extends Foo<idType, EData> // <-- will fail to compile
{ 
    ...
}

这将导致以下编译错误:

type parameter idType is not within its bound
type parameter EData is not within its bound

这是因为Foo期望分别扩展WritableComparable<idType>Writable的类型,但上述错误的FooBar声明会尝试传递不符合这些约束的类型作为Foo的类型参数。

顺便说一下,您发布的错误似乎与您的代码不符,并且最后还有一个额外的>。看来你在复制和粘贴时写了一个拼写错误。