有没有办法将Java Collections与扩展类类型一起使用?

时间:2013-11-14 13:41:50

标签: java generics inheritance collections

我想创建一个除了其他方法签名之外的接口,它将具有这种类型的签名:

Set<Instruction> parse(String rawData);

在实现接口的类中,我想做一个实现:

 Set<Instruction> parse(String rawData){
   //Do work.
   //return an object of type HashSet<DerivedInstruction>.
 }

DerivedInstruction扩展Instruction抽象类的位置。 (指令也可以是一个界面,或者)。

我的观点不在于Collection类型(我知道HashSet实现Set),而是在泛型类型上。 通过搜索,我发现Set<Instruction>HashSet<SpecificInstruction> 扩展Object类型,并且不通过继承关联(至少不直接)。因此,我无法在返回类型上转发HashSet<SpecificInstruction>。关于如何做到这一点的任何想法? 谢谢。

2 个答案:

答案 0 :(得分:7)

以下是一个示例,说明如何放宽parse方法的类型约束:

Set<? extends Instruction> parse(String rawData) {
    //....
}

完整的例子:

interface Instruction {}
class DerivedInstruction implements Instruction {}

Set<? extends Instruction> parse(String rawData){
    return new HashSet<DerivedInstruction>();
}

答案 1 :(得分:1)

  

因此,我无法在返回类型上上传HashSet。任何想法   这该怎么做?谢谢。

然后你需要使用有界通配符的方法:Set<? extends Instruction>?代表未知类型,实际上是Instruction的子类型或Instruction本身的类型。我们说Instruction是通配符的上限。

Set<? extends Instruction> parse(String rawData){
   //Do work.
   //return an object of type HashSet<DerivedInstruction>.
 }

了解此more here.