我想定义一个接口MyList,它是MyThing接口的列表。 MyList的部分语义是它的操作对没有实现MyThing接口的对象没有任何意义。
这是正确的声明吗?
interface MyList<E extends MyThing> extends List<E> { ... }
编辑(第2部分)现在我有另一个接口,它将MyList作为其方法之一返回。
// I'm defining this interface
// it looks like it needs a wildcard or template parameter
interface MyPlace {
MyList getThings();
}
// A sample implementation of this interface
class SpecificPlace<E extends MyThing> implements MyPlace {
MyList<E> getThings();
}
// maybe someone else wants to do the following
// it's a class that is specific to a MyNeatThing which is
// a subclass of MyThing
class SuperNeatoPlace<E extends MyNeatThing> implements MyPlace {
MyList<E> getThings();
// problem?
// this E makes the getThings() signature different, doesn't it?
}
答案 0 :(得分:2)
是的,至少EnumSet
是这样做的。
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
编辑回答第2部分:
我不确定为什么界面中getThings()
的返回类型不会抱怨原始类型。我怀疑由于类型擦除,接口中的警告即使在那里也没用(如果你将返回类型更改为List
则没有警告)。
对于第二个问题,由于MyNeatThing
扩展MyThing
,E
在其范围内。这就是在泛型参数中使用extends
绑定的重点,不是吗?
答案 1 :(得分:1)
对于第1部分,是的,看起来是正确的。
对于你的第2部分,我建议如下。该方法返回一个MyList
的东西,你不知道它是什么(显然不同的实现是不同的),但你知道它是MyThing的子类型。
interface MyPlace {
MyList<? extends MyThing> getThings();
}
答案 2 :(得分:0)
请记住,正确实现java.util.List 之类的接口很难;所以问问自己所有这些问题:
也就是说,您可以使用java.util.List作为示例:
interface MyPlace<T extends MyThing> {
List<T> getThings();
}
class SpecificPlace implements MyPlace<MyThing> {
public List<MyThing> getThings() { return null; }
}
class SuperNeatoPlace implements MyPlace<MyNeatThing> {
public List<MyNeatThing> getThings() { return null; }
}