如何解释这个Java泛型类型定义?

时间:2015-02-10 08:09:06

标签: java netty

以下是netty 4.0.24框架中的一些代码段。解释B类型参数会让人感到困惑。

public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable
{
 ...
}

3 个答案:

答案 0 :(得分:3)

这可能被解释为curiously recurring template pattern的一种形式。

在这种情况下,类型参数B的主要目的是能够引用抽象类中的继承类型。例如,AbstractBootstrap类有一个方法

B channel(Class<? extends C> channelClass)

所以这里的返回类型是作为第一个类型参数给出的任何类型。查看AbstractBoottrap类的已知实现,可以找到

class Bootstrap extends AbstractBootstrap<Bootstrap,Channel>

class ServerBootstrap extends AbstractBootstrap<ServerBootstrap,ServerChannel>

他们接受自己&#34;作为第一个类型参数。因此,这些实现的channel方法将返回&#34;类型本身&#34;。

此处显示了一个可能的使用场景(带有一些虚拟类以使其可编译并指出相关部分):

public class BootstrapExample
{
    public static void main(String[] args)
    {
        // On a Bootstrap, calling the 'channel' method
        // will return a Bootstrap 
        Bootstrap bootstrap = new Bootstrap();
        Bootstrap resultBootstrap = 
            bootstrap.channel(null);

        // On a ServerBootstrap, calling the 'channel' method
        // will return a ServerBootstrap 
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        ServerBootstrap resultSeverBootstrap = 
            serverBootstrap.channel(null);
    }
}

abstract class AbstractBootstrap<
    B extends AbstractBootstrap<B, C>, 
    C extends Channel> implements Cloneable
{
    public B channel(Class<? extends C> channelClass)
    {
        return null;
    }
}
class Bootstrap extends AbstractBootstrap<Bootstrap,Channel> {}
class ServerBootstrap 
    extends AbstractBootstrap<ServerBootstrap,ServerChannel> {}
class Channel {}
class ServerChannel extends Channel {}

暂且不说:我总是提倡类型安全,但是一旦嵌套了这些类型参数,最终可能会出现类或方法声明,这意味着很难手动检查类型边界。因此,只有在可读性和类型安全性之间的权衡是合理的时候才应该使用它们。

答案 1 :(得分:0)

我认为它基本上是一个有2个参数的类,B和C.第一个参数(B)必须是扩展类本身(或子)的东西,第二个参数(C)必须扩展Channel。 / p>

考虑它有点奇怪,但你可以拥有一个与同类型对象一起运行的类。

排序答案:它的参数本身就是一个通道。

答案 2 :(得分:0)

&#34; B&#34;似乎代表了Subclassed AbstractBootstrap本身。它认为(imho)这是一个奇怪的声明,使其成为泛型参数中的子类。

请查看eclipse中子类层次结构的子类,您可能会发现类似

的内容
class AnyClass extends AbstractBootstrap<AnyClass,AChannel>

所以在这个例子中我们重复&#34; AnyClass&#34;在其通用声明中