通用接口:特定内容的列表

时间:2009-05-04 16:56:35

标签: java generics interface

我想定义一个接口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?
}

3 个答案:

答案 0 :(得分:2)

是的,至少EnumSet是这样做的。

  

public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>


编辑回答第2部分:

我不确定为什么界面中getThings()的返回类型不会抱怨原始类型。我怀疑由于类型擦除,接口中的警告即使在那里也没用(如果你将返回类型更改为List则没有警告)。

对于第二个问题,由于MyNeatThing扩展MyThingE在其范围内。这就是在泛型参数中使用extends绑定的重点,不是吗?

答案 1 :(得分:1)

对于第1部分,是的,看起来是正确的。

对于你的第2部分,我建议如下。该方法返回一个MyList的东西,你不知道它是什么(显然不同的实现是不同的),但你知道它是MyThing的子类型。

interface MyPlace {
    MyList<? extends MyThing> getThings();
}

答案 2 :(得分:0)

请记住,正确实现java.util.List 之类的接口很难;所以问问自己所有这些问题:

  • 我可以“按原样”使用java.util.List吗? 我需要添加/删除功能吗?
  • 我可以实现更简单的东西,比如Iterable&lt; T&gt;?
  • 我可以使用作文吗? (与继承相对)
  • 我可以找到 新想要的功能 Google等现有的图书馆 类别?
  • 如果我需要 添加/删除功能,是值得的 增加的复杂性?

也就是说,您可以使用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; }
}