Java:如何在接口层次结构中返回声明的类型?

时间:2012-06-29 02:17:42

标签: java generics

我有一个类似于 -

的界面层次结构
interface Type
{
    Type copy();
};

interface SubType extends Type
{
};

interface SubSubType extends SubType
{
};

具体课程

public class Concrete implements SubSubType
{
    @Override public Concrete copy() { return new Concrete(); }
}

我希望能够在Type上调用copy()并获取Type返回,在SubType上调用copy()并获取SubType,等等。这是否可以实现?可能有仿制药?

提前致谢。

2 个答案:

答案 0 :(得分:5)

像这样:

public interface Type { 
  public Type copy();
}

public interface SubType extends Type { 
  public SubType copy();
}

public class Concrete implements Type { 
  @Override
  public Concrete copy() {
    return new Concrete();
  }
}

public class SubConcrete implements SubType {
  @Override
  public SubConcrete copy() {
    return new SubConcrete();
  }
}

public static void main(String[] args) {
  Type    type    = new Concrete();
  SubType subType = new SubConcrete();

  Type    newType    = type.copy();
  SubType newSubType = subType.copy();
}

答案 1 :(得分:-1)

我想你可以去

interface <T extends Type> Type {
   T copy();
}

interface SubType extends Type<SubType> {
  // any extra methods here
}

然后,实现将是

public class Concrete implements SubType {
   public SubType copy() {
      // code here
   }
}

对于记录,在不复制任何内容时调用方法copy()是一个非常糟糕的主意。

编辑:更正了以下代码。为简单起见,SubXXX接口作为内部类放入,实际上这不太合理。显然我需要切换订单。杜!

public interface Type<T extends Type<?>> {
   T copy();

   public interface SubType<T extends SubType<?>> extends Type<T> {      
   }

   public interface SubSubType extends SubType<SubSubType> {      
   }
}

并且,实现可能如下所示:

   class Concrete implements SubType<Concrete> {

      @Override
      public Concrete copy() {
         return new Concrete();
      }     
   }

这确实看起来很混乱,我更喜欢(并且只是投票)@Tim Pote回答。