我使用接口设计了一个完整的API,客户端可以使用这些接口来实现某些行为。在内部,我想使用我自己的实现类来使用更丰富的API。我希望这些实现继续符合基于接口的API,但Java对泛型的处理正在阻碍。
以下是一个例子:
public interface PublicAPI {
void doSomething(SomeType object);
}
public class SomeTypeImpl implements SomeType { }
public class InternalClass implements PublicAPI {
public void doSomething(SomeTypeImpl object) {
// ...
}
}
在某些情况下,可以在公共API中使用通配符(例如<T extends SomeType>
)指定类型,但这会导致使用会导致方法冲突的泛型集合。
所以我问你,有没有办法支持这种类型的设计(或更好的设计),或者我注定要在我的内部类和公共API的实现之间来回转换?
谢谢!
更新
我已经更好地理解为什么实际上不可能强制执行比API提供的更具体的类型。一旦有人拥有你的对象的实例,就可以用较少的特定类型对其进行“污染”。
根据ACL建议,我采用了在我自己的特定包中使用内部类的方法,然后使用公共API接口创建它们的“视图”。创建视图后,该对象将标记为不纯,并且无法再保证对象属于除接口之外的任何类型。在我自己的类中,我在处理不纯的对象时抛出异常(因为这意味着允许引用过早泄漏)。
我会将问题留给进一步的见解。
答案 0 :(得分:1)
为什么不对您的界面进行整合?类似的东西:
public interface PublicAPI<T extends SomeType> {
void doSomething(T object);
}
顺便说一下,您可以将接口扩展为:
public interface InternalPublicAPI扩展了PublicAPI { ....在这里添加你的内部方法 }
在Hibernate中有这样的东西,有Session
和SessionImplementor
接口。