我遇到以下与泛型有关的问题。我有以下内容:
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;
}
}
确实有效。该方法被认为是有效的实现。
有谁知道为什么会这样?
答案 0 :(得分:4)
第一个声明说,为了实现InterfaceA
,子类需要提供一个方法methodName
,它适用于扩展T
的任何类型DTOInterface
方法调用者的选择。换句话说,T
是methodName
的调用者可以选择的参数;实现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>
类型,这反过来意味着您的类型安全。