2

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

接口A为:

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

2 回答 2

4

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

另一方面,第二个声明是一个接口,它允许实现者T为该特定选择提供一个特定的值,并且只实现它的方法。ImplementationA选择InterfaceA只为DTOInterface(即DTOImplementation)的一个特定子类型实现,并提供一种仅用于该选择的方法T。这完全没问题。

于 2013-10-04T11:34:26.997 回答
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>,这反过来意味着您具有类型安全性。

于 2013-10-04T11:36:36.090 回答