[英]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
换句话说, T
是methodName
的调用者可以选择的参数。 实现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.