2013-10-04 42 views
2

我对泛型有以下问题。我有以下几点:Java泛型:在方法级别和接口级别定义的通用参数

了InterfaceA为:

public interface InterfaceA { 
    public <T extends DTOInterface> Object methodName (T dto) {} 
} 

DTOInterface只是一个空接口。

然后我的实现将是:

public class ImplementationA implements InterfaceA { 
    public Object methodName(DTOImplementation dto) { 
     return null; 
    } 
} 

DTOImplementation只是实现DTOInterface类。

这是失败的,因为ImplementationA中的方法不被识别为InterfaceA中方法的有效实现。

但是,如果我定义的参数在接口水平,即

public interface InterfaceA **<T extends DTOInterface>** { 
    public Object methodName (T dto) {} 
} 

,然后定义作为实现:

public class ImplementationA implements **InterfaceA<DTOImplementation>** { 
    public Object methodName(DTOImplementation dto) { 
     return null; 
    } 
} 

它的工作。该方法被认为是一个有效的实现。

有谁知道为什么会发生这种情况?

回答

4

第一个声明说,为了实现InterfaceA,子类必须提供一种方法methodName,对于扩展方法调用者的选择的DTOInterface任何类型T工作。换句话说,TmethodName的调用者可以选择的参数;执行InterfaceA的类不会选择它。因此,当您提供的实现尝试为methodName选择T的特定值并且仅实现该值时,编译器会拒绝您的程序。

另一方面,第二个声明是一个接口,该接口允许实现者为T提供特定值,并仅实现该特定选择的方法。 ImplementationA仅针对DTOInterface(即DTOImplementation)的一个特定子类型选择实施InterfaceA,并且仅为T的选择提供了一种方法。这很好。

2

interface定义有一个通用的方法

public <T extends DTOInterface> Object methodName (T dto) {} 

这种方法指出,它可以将任何类型Textends DTOInterface。如果要实施interface,则需要在实施中提供与完全相同的方法

你不能在一个实施限制的方法,因为如果你这样做会发生什么:

AnotherDTOImplementation adi = new AnotherDTOImplementation(); 
InterfaceA obj = new ImplementationA(); 
ojb.methodName(adi); 

这显然打破了类型安全。

在你的第二个例子中,你有一个通用的接口。这意味着当你实现interface时,你必须声明通用类型来指定实现为通用的class

这意味着ImplementationAInterfaceA<DTOImplementation>类型,这意味着您有类型安全。