繁体   English   中英

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

[英]Java generics: Generic parameter defined at method level vs interface level

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

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

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

有人知道为什么会这样吗?

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

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

您的interface定义具有通用方法

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

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

您不能在实现中限制该方法,因为如果这样做,将会发生以下情况:

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

这显然破坏了类型安全性。

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

这意味着ImplementationA的类型为InterfaceA<DTOImplementation> ,这又意味着您具有安全性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM