为什么Java中不允许使用类中的隐式泛型?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么Java中不允许使用类中的隐式泛型?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2164字,纯文字阅读大概需要4分钟。
内容图文
![为什么Java中不允许使用类中的隐式泛型?](/upload/InfoBanner/zyjiaocheng/775/a4e21fdbae244876800c24f632582459.jpg)
我试图理解为什么Java不允许在泛型类中使用隐式类型,就像在泛型方法中一样.
我已经在网上搜索了这个问题的答案,但是还没有找到一个原因,为什么Java中不支持以下内容:
// This will not compile:
public <T> interface ElementPicker<L extends List<T>> { ... }
// This on the other hand will
public interface ElementPicker<T, L extends List<T>> { ... }
所以我们必须在类泛型参数中明确提到类型T.这当然意味着我们现在必须写:
ElementPicker<Integer, List<Integer>>
// instead of just:
ElementPicker<List<Integer>>
这导致我的代码中的头疼不断,我试图明智地平衡使用泛型,同时使我的类型可读和简短.
不幸的是,在我当前的项目中,我正在处理一堆嵌套的泛型类型,并且它们的类型参数冒泡到顶部,因此我有很长的顶级类,必须包含所有泛型类型数据.
要了解这可能会成为一个问题,请考虑:
interface ScalarValue<T extends Number> {
T toNumber();
}
interface ScalarAdder<T, U extends ScalarValue<T>> {
T add(U v1, U v2);
}
class ScalarAccumulator<T, U extends ScalarValue<T>,
A extends ScalarAdder<T, U>> {
...
}
// Assuming we have these implementations:
class RationalValue implements ScalarValue<Float> { .. }
class RationalAdder implements ScalarAdder<Float, RationalValue> { .. }
// A typical type could look like this monster:
ScalarAccumulator<Float, RationalValue, RationalAdder>
// Whereas an implicit declaration like this:
public <T extends Number,
U extends ScalarValue<T>,
A extends ScalarAdder<T, U>
class ScalarAccumulator<A> { ... }
// ... would allow us to simply write
ScalarAccumulator<RationalAdder>
// ...as all other types can be inferred.
这也是一个例子,但我在工作中经常遇到这些事情.我还没有找到为什么这是不可能的原因.方法可以很好(从单个值及其类推断类型).
那么为什么Java可以在方法中支持,而不是在类中支持?我想不出一个例子,如果一个类没有明确地包含该类型将是一个问题.但我可能错过了一些东西.
如果有人在处理这些情况时有任何关于解决方法的好方法,我也会很感激.
解决方法:
在Java 10中,您可以使用var来跳过类型声明.这是一种(有点hacky)将它与类型推断相结合的方法,因此您可以在不声明所有嵌套类型的情况下创建实例:
static <T, U extends ScalarValue<T>, A extends ScalarAdder<T, U>> ScalarAccumulator<T, U, A> create(Class<A> adderClass) {
return new ScalarAccumulator<>();
}
static void test() {
var a = create(RationalAdder.class);
}
内容总结
以上是互联网集市为您收集整理的为什么Java中不允许使用类中的隐式泛型?全部内容,希望文章能够帮你解决为什么Java中不允许使用类中的隐式泛型?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。