循环通用依赖项

时间:2010-06-30 07:45:20

标签: java generics

假设我有两节课。每个类都有一个参数。第一类的参数限制为第二类,反之亦然。但还有一项要求。此参数还必须由类本身进行参数化。 最好通过示例解释:

public class Class1<T extends Class2<Class1>> {
    ...
}

public class Class2<T extends Class1<Class2>> {
   ...
}

但是,这种结构不起作用。编译器告诉Type parameter Class2 is not within its bound。这是完全可以理解的,因为编译器无法解决这种无休止的递归。

但我想知道有什么优雅的方法可以通过通用获得想要的东西吗?

3 个答案:

答案 0 :(得分:6)

看起来我突然找到了答案。

public class Class1<T extends Class2<P, T>, P extends Class1<T,P>> {
}

public class Class2<T extends Class1<P, T>, P extends Class2<T, P>> {
}

这完全令人费解,但它似乎正在发挥作用。

答案 1 :(得分:3)

我认为你应该这样写:

 class Class1<T extends Class2<? extends Class1<T>>> { }  
 class Class2<T extends Class1<? extends Class2<T>>> { }

 class Class1<T extends Class2<? extends Class1<?>>> { }  
 class Class2<T extends Class1<? extends Class2<?>>> { }

适用于Java 1.6。

答案 2 :(得分:1)

我不确定我理解你的问题 - 请注意,因为你的例子中的两个类都是通用的,所以它们作为参数也应该包括它们的泛型参数,这会导致无休止的递归。

循环通用引用是可能的,但方式略有不同。以下是an earlier answer of mine的示例。