相关疑难解决方法(0)

Java Enum定义

我以为我很了解Java泛型,但后来我在java.lang.Enum中遇到了以下内容:

class Enum<E extends Enum<E>>
Run Code Online (Sandbox Code Playgroud)

有人可以解释如何解释这个类型参数?用于提供可以使用类似类型参数的其他示例的加分点.

java generics enums crtp

146
推荐指数
3
解决办法
2万
查看次数

通过将新类型指定为通用的实际类型来扩展泛型有什么好处

我在某处看到了这种模式:

class A extends B<A> {

}
Run Code Online (Sandbox Code Playgroud)

通过将新类型指定为泛型的实际类型,此结构对于扩展泛型有点不寻常.有什么用?这个模式有名字吗?有没有替代模式?

示例:https://code.google.com/p/selenium/wiki/LoadableComponent

跳到: public class EditIssue extends LoadableComponent<EditIssue> {

编辑:阅读完回复后,我似乎需要改变编译器对类型检查的理解.在我的脑海里,我的牛肉有这种模式,如果两个A需要相同,那么有没有办法不重复它们?但似乎没有更好的方法将派生类的类型传播给父类.

java generics

6
推荐指数
1
解决办法
412
查看次数

Java中CRTP的替代方案

CRTP模式允许模仿所谓的自我类型Java的,例如:

abstract class AbstractFoo<SELF extends AbstractFoo<SELF>> implements Comparable<SELF> {
    @Override
    public final int compareTo(final SELF o) {
        // ...
    }
}

final class C1 extends AbstractFoo<C1> {
    // ...
}

final class C2 extends AbstractFoo<C2> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码(Comparable为了清楚起见选择了界面;当然还有其他用例),我可以轻松地比较两个实例C1:

new C1().compareTo(new C1());
Run Code Online (Sandbox Code Playgroud)

但不是AbstractFoo具体类型不同的后代:

new C1().compareTo(new C2()); // compilation error
Run Code Online (Sandbox Code Playgroud)

但是,滥用模式很容易:

final class C3 extends AbstractFoo<C1> {
    // ...
}

// ...

new C3().compareTo(new C1()); // compiles cleanly …
Run Code Online (Sandbox Code Playgroud)

java generics crtp

5
推荐指数
1
解决办法
207
查看次数

标签 统计

generics ×3

java ×3

crtp ×2

enums ×1