Java中的参数化类型(GADT)
Posted
技术标签:
【中文标题】Java中的参数化类型(GADT)【英文标题】:Parametrizing type in Java (GADT) 【发布时间】:2012-02-07 00:25:45 【问题描述】:我需要在 Java 中有这样的 GADT,比如
interface Action<C, O>
Collection<O> doAction(C<O> predicate)
这样我就可以轻松地声明类
class Selector<T>
...
然后将其与接受 Selector 实例的 Action 的实现一起使用。并且 Action 的实现也接受 Predicate - 但参数的类型必须与集合的返回类型匹配。
主要思想是让一种类型依赖于另一种类型。这在普通的旧 Java 6 中可能吗?
【问题讨论】:
我不确定我是否跟随。我认为您可以将Action
定义为Action<O, C<O>>
(尽管您也可以将C
用于predicate
的类型)。与大多数语言一样,Java 不支持高阶类型。
@TomHawtin-tackline ActionAction<O,C<O>>
。呃,是的。 interface Action<C, O> Collection<O> doAction(C predicate);
.
【参考方案1】:
这是行不通的,因为没有强制要求Action<C, O>
中的C
本身就是一个参数化类型。例如,您可以声明一个Action<String, Object>
——然后predicate
应该是什么?没有 String<Object>
这样的东西。
在不知道更多细节的情况下,在我看来你想要的是更具体的东西,例如,定义一个Predicate<T>
接口:
interface Predicate<T>
interface Action<C extends Predicate<O>, O>
Collection<O> doAction(C predicate);
class Selector<T> implements Predicate<T>
【讨论】:
以上是关于Java中的参数化类型(GADT)的主要内容,如果未能解决你的问题,请参考以下文章