3

我有一个像下面这样的课程

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>>();

所以这很好用:

现在我想扩展这个类来增加一个字段

私有字符串 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
4

1 回答 1

4

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

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

如果你想让用户只指定其中一种类型,你可以这样做,例如你想强制Integerfor 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类型参数上指定与 base 上的约束匹配的约束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.

顺便说一句,您的错误似乎与您的代码不匹配,并且>最后有一个额外的错误。看来您在复制和粘贴时打错了。

于 2013-08-12T19:47:13.080 回答