2

我使用接口设计了一个完整的 API,客户端可以实现这些 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 接口创建它们的“视图”。一旦创建了视图,该对象就会被标记为不纯,并且不能再保证对象是接口以外的任何类型。在我自己的类中,当处理不纯的对象时,我会抛出异常(因为这意味着允许引用过早泄漏)。

我将把这个问题留给进一步的见解。

4

1 回答 1

1

你为什么不通用你的界面?就像是:

public interface PublicAPI<T extends SomeType> {
    void doSomething(T object);
}

顺便说一句,您可以将接口扩展为:

公共接口 InternalPublicAPI 扩展 PublicAPI { .... 在此处添加您的内部方法 }

Hibernate中有这样的东西,有SessionSessionImplementor接口。

于 2012-06-29T22:46:13.667 回答