【发布时间】:2015-03-29 14:28:35
【问题描述】:
我正在玩一个有趣的架构。人们可以制作包含 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.lang.是否有一些语法(或技巧)可以用来完成它的目的?实际上,我不想将常量类型指定为泛型参数,而是想将可参数化类型指定为泛型参数(然后它本身将在 get 方法中参数化)。是的,这归结为 java 没有的更高种类的类型;如此疯狂丑陋的 hack 非常受欢迎!
由于其他设计限制而无法使用的常见解决方案:
- 将 get/put/etc 操作移到内部
Obj类中 - 创建
Store.Obj<T>的一些超类型并指定接受该超类型的接口,而不是泛型参数。
【问题讨论】:
-
我不确定我是否理解这个问题。你想达到什么目的?也许您想要
之类的东西? -
不是真的,不; Java 的类型系统不支持更高种类的类型,这是您要查找的术语。
-
@LouisWasserman 太糟糕了。我来自 C++ 领域,它(超级偶然)实际上确实有这些更高种类的类型。
标签: java generics nested-generics