java - 为什么java循环通用规范不允许将 "this"转换为通用实例

标签 java generics subclass

我可以创建一个循环泛型类依赖项,但不知何故我无法将(没有编译错误)“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
        }
    }

} 

我为我糟糕的英语道歉。

感谢您的帮助。

最佳答案

您应该使用更通用的类:

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
    }
}

关于java - 为什么java循环通用规范不允许将 "this"转换为通用实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27272857/

相关文章:

c# - 界面中发生了什么?

方法中不相关泛型的 Java 删除错误

ios - swift 如何比较泛型

ios - UIViewController 子类也会影响我的 UITableViewControllers 吗?

Java获取图像,检查mime类型,转换为png并返回该图像

java - 返回私有(private)静态变量

java - 无法加载库 'netty_transport_native_kqueue_x86_64' ,尝试其他加载机制

java - 从excel中读取测试数据

swift - 在 Swift 中打印类变量 - 预期声明错误

swift - 没有为 SKShapeNode 指定初始化(circleOfRadius : radius)