没有参考书,任何人都可以CRTP用代码示例提供一个很好的解释吗?
我正在努力使API尽可能用户友好.
让我们:
class B extends A {}
class A {
A setX(){ ...; return this; }
}
Run Code Online (Sandbox Code Playgroud)
现在这个
B b = new B().setX();
Run Code Online (Sandbox Code Playgroud)
无效,必须铸造:
B b = (B) new B().setX();
Run Code Online (Sandbox Code Playgroud)
是否有一种方法使用泛型A使编译器知道"this"类型并接受第一种方式 - 没有强制转换并且没有在使用的地方传递类型参数?(不new B<B>().setX(),那很难看.)
我知道为什么Java需要在这种情况下重新输入.请不要回答解释答案setX()A. 我知道.
我在问仿制药能否解决这个问题.
对于那些仍然想告诉我"这就是静态类型如何工作"和"甚至泛型不能帮助解决"的人,请考虑这个有效的Java代码:
Map<String, String> map = new HashMap(){{ put( "foo", new RuntimeException() );
String foo = map.get("foo"); // ClassCastException!!
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到泛型DO允许您在代码中没有出现实际类型转换的情况下获得CCE.
这就是为什么我希望泛型允许摆脱显式类型转换的原因.
此外,IIRC C++允许这样做.
以下是我的代码
class A<B2 extends B, A2 extends A<B2, A2>> {
C<B2, A2> c;
void test() {
c.acceptParameterOfTypeA(this);
}
}
class B {
}
class C<B2 extends B, A2 extends A<B2, A2>> {
void acceptParameterOfTypeA(A2 a) {
}
}
Run Code Online (Sandbox Code Playgroud)
错误发生在c.acceptParameterOfTypeA(this);.
错误是
类型C中的方法acceptParameterOfTypeA(A2)不适用于参数(A)
从我看到的,该方法acceptParameterOfTypeA需要一个类型A的参数,并this在给出错误的行是类型A.
我究竟做错了什么?如何解决这个问题?
如果它很重要,我正在使用Java8
另一个Java Generics未经检查的演员问题即将出现:
我们有以下内容:
public abstract class A<T extends A> {
public final T doSomething() {
return (T)this; //unchecked cast A<T> to T
}
}
Run Code Online (Sandbox Code Playgroud)
那么,这种不受限制的演员是我们可以抑制的东西还是真的存在这种情况会失败?