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&lt;O, C&lt;O&gt;&gt;(尽管您也可以将C 用于predicate 的类型)。与大多数语言一样,Java 不支持高阶类型。 @TomHawtin-tackline Action> 是无效定义。 你不能仅仅因为 C 是泛型就不能保证 C 是 O 的泛型类型。你可以指定 C 从特定类扩展或实现可以包含 O 的特定接口。你能提供有关 C、O 的更多信息? Action&lt;O,C&lt;O&gt;&gt;。呃,是的。 interface Action&lt;C, O&gt; Collection&lt;O&gt; doAction(C predicate); . 【参考方案1】:

这是行不通的,因为没有强制要求Action&lt;C, O&gt; 中的C 本身就是一个参数化类型。例如,您可以声明一个Action&lt;String, Object&gt;——然后predicate 应该是什么?没有 String&lt;Object&gt; 这样的东西。

在不知道更多细节的情况下,在我看来你想要的是更具体的东西,例如,定义一个Predicate&lt;T&gt; 接口:

interface Predicate<T> 


interface Action<C extends Predicate<O>, O> 
    Collection<O> doAction(C predicate);


class Selector<T> implements Predicate<T> 

【讨论】:

以上是关于Java中的参数化类型(GADT)的主要内容,如果未能解决你的问题,请参考以下文章

Java 泛型

Java中的泛型理解

Java重要技术(20)泛型之参数化类型的特点

我无法让基于 GADT 的玩具动态类型与参数类型一起使用

Java基础知识(JAVA之泛型)

Java 反射 ParameterizedType 参数化类型