我有一个类似下面的课程
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
答案 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
的类型参数。
顺便说一下,您发布的错误似乎与您的代码不符,并且最后还有一个额外的>
。看来你在复制和粘贴时写了一个拼写错误。