我正在玩一个有趣的架构。人们可以制作包含 StoredObjects 的 Store。商店可以支持由接口表示的不同操作(即Get、Put、Print)。
这是它的样子,高度简化:
interface Put<Foo>{
public void put(Foo f);
}
class Store implements Put<Store.Obj<?>> {
class Obj<T> {
public T o;
}
@Override
public void put(Obj<?> o) { }
}
public class Main {
public static void main(String[] args){
Store s = new Store();
Store.Obj<String> o = s.new Obj<>();
s.put(o);
}
}
当我想实现类似的“get”方法时,问题就出现了。理想情况下,我想要一个如下所示的界面:
interface Get<Foo> {
public <T> T get(Foo<T> f);
}
显然,这是畸形的java。是否有一些语法(或 hack)可以用来完成它的目的?实际上,我不想将常量类型指定为泛型参数,而是将可参数化类型指定为泛型参数(然后它本身将在 get 方法中参数化)。是的,这归结为 java 没有的更高种类的类型;如此疯狂 - 丑陋的黑客非常受欢迎!
由于其他设计限制而无法使用的常见解决方案:
- 将 get/put/etc 操作移入内部
Obj
类 - 创建一些超类型
Store.Obj<T>
并指定要采用它的接口,而不是通用参数。