首页 / JAVA / Java泛型-需要说明
Java泛型-需要说明
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java泛型-需要说明,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3053字,纯文字阅读大概需要5分钟。
内容图文
![Java泛型-需要说明](/upload/InfoBanner/zyjiaocheng/675/7ef4fec539594704b278505e24ba7fb6.jpg)
我对Java泛型有疑问.在下面的代码中,接口B由必须实现接口A的另一种类型参数化.
该代码是正确的.
问题是:为什么它不能与以下list()方法声明一起使用?
private <X extends A, Y extends B<X>> List<Y> list()
工作代码:
public interface A {
}
public interface B<T extends A> {
}
public class Test {
private static class AA implements A {}
private static class BB implements B<AA> {}
private <R extends A, X extends R, Y extends B<X>> List<Y> list() {
return null;
}
private void test() {
List<BB> l = list();
}
}
编辑:
我重新编写了代码.现在,我们的鸟已经通过它发出的声音而被修复.问题是为什么useless_t是必需的?
public class Test {
public interface Sound {
}
public interface Bird<T extends Sound> {
}
private static class Quack implements Sound {}
private static class Duck implements Bird<Quack> {}
private <useless_t extends Sound, sound_t extends useless_t, bird_t extends Bird<sound_t>> List<bird_t> list() {
return null;
}
private void test() {
List<Duck> l = list();
}
}
解决方法:
我的Eclipse IDE不会按原样编译您的任何代码示例.但是当给出其他类型提示时,它们确实会编译.在第二个示例中,无论是否带有类型参数useless_t,以下行都不会对我编译:
List<Duck> l = list();
但是以下内容确实为我编译了:
List<Duck> l = this.<Sound, Quack, Duck> list();
剔除useless_t时,也会进行以下编译:
List<Duck> l = this.<Quack, Duck> list();
因此,基本上,这是编译器无法正确获取类型参数的问题,您需要显式地指定类型.
更新:如果您确实遇到了添加useless_t有所不同的程序,那么您将处于不安全的环境,并且依赖于未指定的编译器行为.
您遇到了一个问题,即不同的编译器的行为有所不同,即类型推断.对于编译器必须在何处推断类型以及在何处必须拒绝推断,JLS尚不完全清楚,因此此处存在摆动空间. Eclipse编译器的不同版本和javac的不同版本在推断类型的地方不同.对于javac,即使比较不同的1.5.0_x版本也是如此,并且Eclipse编译器通常可以推断出比javac更多的内容.
您仅应在所有常见编译器都成功的地方依靠类型推断,否则应给出类型提示.有时,这与引入临时变量一样容易,但是有时(如您的示例),您必须使用var.< Types> method()语法.
关于评论:如果我希望方法Duck.getSound()返回Quack,而不是使用泛型的Sound怎么办?
假设Bird界面具有以下方法:
public interface Bird<T extends Sound> {
T getSound();
}
然后,您可以像这样实现它:
private static class Duck implements Bird<Quack> {
public Quack getSound() { return new Quack(); }
}
这是泛型的一种用例-允许实现指定具体类型,以便即使超类也可以使用该类型. (Bird接口可以具有setSound(T),或用T做其他事情,而无需了解T的具体类型.)
如果呼叫者仅知道实例的类型为Bird< ;?扩展Sound> ;,他必须像这样调用getSound:
Sound birdSound = bird.getSound();
如果调用者知道Quack,则可以执行一个testof实例.但是,如果呼叫者知道那只鸟确实是Bird" Quack> ;,甚至那只是鸭子,那么他可以编写该代码,并根据需要进行编译:
Quack birdSound = bird.getSound();
但要注意:生成过多的接口或超类中使用的类型会带来使系统过于复杂的风险.正如Slanec所写,重新考虑您的实际设计,以查看是否真的需要拥有这么多的泛型.
我曾经走得太远,最终得出了一个接口层次结构和两个实现层次结构,基于这样的接口:
interface Tree<N extends Node<N>,
T extends Tree<N, T>> { ... }
interface SearchableTree<N extends SearchableNode<N>,
S extends Searcher<N>,
T extends SearchableTree<N, S, T>>
extends Tree<N, T> { ... }
我不建议遵循该示例.
内容总结
以上是互联网集市为您收集整理的Java泛型-需要说明全部内容,希望文章能够帮你解决Java泛型-需要说明所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。