2014-12-03 42 views
0

我可以创建一个循环泛型类依赖项,但不知怎的,我无法将“this”实例转换为泛型引用(无编译错误)。据我所知 - 在循环泛型场景中创建破坏依赖关系的子类是不可能的。为什么Java通用规范不允许将“this”转换为通用实例

public class P 
{ 
    public static abstract class Network<C extends Client<N, C>, N extends Network<C, N>> 
    { 
     private C client; 

     public void addClient(C client) 
     { 
      this.client = client; 
     } 
    } 

    public static abstract class Client<N extends Network<C, N>, C extends Client<N, C>> 
    { 
     private N network; 

     public void setNetwork(N network) 
     { 
      this.network = network; 
     } 

     public void attachOtherClient(C client) 
     { 
      network.addClient(client); 
     } 

     public void attachSelf() 
     { 
      attachOtherClient(this); //does not compile, but it is impossible to create subclasses that breaks this safety (i think) 
     } 
    } 

    public static class TCP extends Network<MK, TCP> 
    { 

    } 

    public static class MK extends Client<TCP, MK> 
    { 
     @Override 
     public void attachSelf() 
     { 
      attachOtherClient(this); //compiles without problems 
     } 
    } 

} 

我为我的坏英语道歉。

谢谢你的帮助。

回答

1

C延伸Client<N,C>,但Client<N,C>(的this类型)不一定延长C(参数类型的attachOtherClient())。

,但它不可能创造,打破这种安全

不是不可能的子类。考虑

class TCP extends Network<MK, TCP> { } 
class MK extends Client<TCP, MK> { } 
class MK2 extends Client<TCP, MK> { } 

这满足所有的界限和正确编译。然而在MK2里面,如果你通过thisattachOtherClient(),你会传递一个MK2到期望MK,这显然是错误的。

+0

我明白。但是,是否有可能对仅允许2类依赖的循环泛型进行建模?我的意思是 - 客户端的MK2子类应该是不可能编译的。 – 2014-12-04 09:46:15

+0

@MichaelP:2级依赖不相关。同样的事情发生在1类“自我界限”类型中 - 不可能有一个类型参数,使得'this'保证是类型参数的一个实例。 – newacct 2014-12-04 18:38:45

+0

非常感谢! – 2014-12-05 06:56:48

2

你应该使用更多的一般类:

public static abstract class Network<C extends Client<N, C>, N extends Network<C, N>> 
{ 
    private Client<N, C> client; // <== generic type 

    public void addClient(Client<N, C> client) 
    { 
     this.client = client; 
    } 
} 

public static abstract class Client<N extends Network<C, N>, C extends Client<N, C>> 
{ 
    private Network<C, N> network; // <== generic type 

    public void setNetwork(N network) 
    { 
     this.network = network; 
    } 

    public void attachOtherClient(Client<N, C> client) 
    { 
     network.addClient(client); 
    } 

    public void attachSelf() 
    { 
     attachOtherClient(this); // compiles & works: 'this' has type Client<N, C>, not C 
    } 
} 
相关问题