我正在尝试使 API 尽可能用户友好。
让我们:
class B extends A {}
class A {
A setX(){ ...; return this; }
}
现在这个
B b = new B().setX();
无效,必须强制转换:
B b = (B) new B().setX();
有没有办法使用泛型A
让编译器知道“这个”类型并接受第一种方式 - 没有强制转换并且没有在使用的地方传递类型参数?(即不是new B<B>().setX()
,那很难看。)
我知道为什么 Java 在这种情况下需要重新输入。请不要解释setX()
返回 A的答案。我知道。
我在问泛型是否可以解决这个问题。
对于那些仍然想告诉我“这就是静态类型的工作原理”和“甚至泛型都无法提供帮助”的人,请考虑以下有效的 Java 代码:
Map<String, String> map = new HashMap(){{ put( "foo", new RuntimeException() );
String foo = map.get("foo"); // ClassCastException!!
因此,您可以看到泛型确实允许您在代码中不出现实际类型转换的情况下获得 CCE。
这就是为什么我希望泛型允许摆脱显式类型转换的原因。
此外,IIRC C++ 允许.