Java泛型:在方法级别与接口级别定义的通用参数

时间:2013-10-04 11:22:36

标签: java generics

我遇到以下与泛型有关的问题。我有以下内容:

InterfaceA as:

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

确实有效。该方法被认为是有效的实现。

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

您的interface定义具有通用方法

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

此方法声明T采用任何类型extends DTOInterface。如果要实现interface,则需要在实现中提供完全相同的方法

您无法在实现中限制该方法,因为如果您执行此操作会发生什么:

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

这显然打破了类型安全。

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

这意味着ImplementationA属于InterfaceA<DTOImplementation>类型,这反过来意味着您的类型安全。