我试图理解为什么Java不允许在泛型类中使用隐式类型,就像在泛型方法中一样.
我已经在网上搜索了这个问题的答案,但是还没有找到一个原因,为什么Java中不支持以下内容:
// This will not compile:
public interface ElementPicker> { ... }
// This on the other hand will
public interface ElementPicker> { ... }
所以我们必须在类泛型参数中明确提到类型T.这当然意味着我们现在必须写:
ElementPicker>
// instead of just:
ElementPicker>
这导致我的代码中的头疼不断,我试图明智地平衡使用泛型,同时使我的类型可读和简短.
不幸的是,在我当前的项目中,我正在处理一堆嵌套的泛型类型,并且它们的类型参数冒泡到顶部,因此我有很长的顶级类,必须包含所有泛型类型数据.
要了解这可能会成为一个问题,请考虑:
interface ScalarValue {
T toNumber();
}
interface ScalarAdder> {
T add(U v1, U v2);
}
class ScalarAccumulator,
A extends ScalarAdder> {
...
}
// Assuming we have these implementations:
class RationalValue implements ScalarValue { .. }
class RationalAdder implements ScalarAdder { .. }
// A typical type could look like this monster:
ScalarAccumulator
// Whereas an implicit declaration like this:
public
U extends ScalarValue,
A extends ScalarAdder
class ScalarAccumulator { ... }
// ... would allow us to simply write
ScalarAccumulator
// ...as all other types can be inferred.
这也是一个例子,但我在工作中经常遇到这些事情.我还没有找到为什么这是不可能的原因.方法可以很好(从单个值及其类推断类型).
那么为什么Java可以在方法中支持,而不是在类中支持?我想不出一个例子,如果一个类没有明确地包含该类型将是一个问题.但我可能错过了一些东西.
如果有人在处理这些情况时有任何关于解决方法的好方法,我也会很感激.
解决方法:
在Java 10中,您可以使用var来跳过类型声明.这是一种(有点hacky)将它与类型推断相结合的方法,因此您可以在不声明所有嵌套类型的情况下创建实例:
static , A extends ScalarAdder> ScalarAccumulator create(Class adderClass) {
return new ScalarAccumulator<>();
}
static void test() {
var a = create(RationalAdder.class);
}
标签:java,generics
来源: https://codeday.me/bug/20190705/1387320.html