2010-06-30 142 views
1

假设我有两个类。每个类都有一个参数。第一类的参数绑定到第二类,反之亦然。但是还有一个额外的要求。该参数也必须由类本身进行参数化。 这是更好地通过例子来说明:循环通用依赖

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

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

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

但我想知道是否有任何优雅的方式来获得想要通过泛型?

回答

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。

+1

您仍然有最右边的类型名称,没有它的泛型参数。如果你想要这种通配性,也许增加一个''。 – 2010-06-30 09:29:48

+0

@tom hawtin谢谢,更新的答案。 – uthark 2010-06-30 10:13:47

5

它看起来像我突然发现答案。

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

做的工作,谢谢:) – 2017-03-31 10:18:38

1

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

循环泛型引用是可能的,但方式稍有不同。以下是来自an earlier answer of mine的示例。

+0

感谢您的答案。虽然调查发现参数定义中的无限递归可能被第二个参数打破,但根据下面的答案,还有更好的解决方案。 – wax 2010-06-30 08:05:50