2012-06-29 29 views
3

我有类似的接口层次 -Java:如何在界面层次结构中返回声明的类型?

interface Type 
{ 
    Type copy(); 
}; 

interface SubType extends Type 
{ 
}; 

interface SubSubType extends SubType 
{ 
}; 

而具体的类

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

我希望能够在一个呼叫类型副本(),并得到一个类型回来,调用拷贝()在SubType上并返回一个SubType,这是可以实现的吗?可能与泛型?

在此先感谢。

回答

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(); 
} 
+0

这是合法吗?它如何知道你是否返回一个Type(在Type接口中声明)或SubType(如在SubType接口中声明的)?你是通过不寻常的返回类型重载。 (这是Java 7中的新东西,还是我真的落后于时代?) – user949300

+1

@user:这是Java 5中的新功能。它被称为[返回类型协变](http://en.wikipedia.org/wiki/Covariant_return_type )。编译器会认为静态返回类型是你调用'copy()'的变量声明类型的返回类型。换句话说,如果你有一个'Type type = new SubConcrete();''你不能'SubType subType = type.copy()'没有强制转换。 –

+0

@Mark Peters谢谢!尽管如此,我仍然觉得很困惑,但我可以看到它可能有用。国际海事组织,我的解决方案更清晰(更明确)。因人而异。 – user949300

-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 
    } 
} 

根据记录,调用方法复制()时它不会复制任何东西是一个非常糟糕的主意。

编辑:更正下面的代码。为了简单起见,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答案。

+1

这是否甚至编译:'interface Type'?似乎不适合我。如果将其更改为'interface Type ',您将得到一个编译器警告,您可以通过执行此操作来修复:''Type >'。但是,对SubType而言会更困惑,而且更容易混淆SubSubType。 –

+0

我没有带编译器在我的电脑上,所以它必须等到明天才能查看详细信息。但我过去做过类似的事情。 – user949300

+0

它应该只是'接口类型'。然后'interface SubType extends Type ' – newacct