2012-01-10 126 views
0

我需要有这样的排序GADT在Java中,像参数化类型

interface Action<C, O> { 
    Collection<O> doAction(C<O> predicate) 
} 

,所以我可以很容易地声明类像

class Selector<T> { 
... 
} 

,然后用执行使用它例如,接受Selector实例的动作。并且Action的实现也接受谓词 - 但参数的类型必须匹配返回类型的集合。

主要想法是有一种类型依赖于另一种类型。这在普通的旧式Java 6中可能吗?

+0

我不知道,我跟随。你可以将'Action'定义为'Action >',我认为(尽管你可能会用'C'作为'predicate'的类型)。与大多数语言一样,Java不支持更高阶的类型。 – 2012-01-10 15:41:47

+0

@ TomHawtin-tackline行动>是无效的定义。 – jdevelop 2012-01-10 15:45:27

+0

您不仅可以因为C是通用的,您不能保证C是O的泛型类型。您可以指定C从特定类扩展或实现可包含O的特定接口。您是否可以提供有关C,O的更多信息? – Cromat 2012-01-10 15:48:48

回答

0

这不起作用,因为没有什么东西强制执行CAction<C, O>本身是一个参数化类型。例如,您可以声明一个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> { 
}