如何解决Java泛型用法和对象
我正在研究Java编程简介(包括数据结构,第11版,Y。Daniel Liang)中的实践问题。
19.24 Which of the following can be used to replace YYYYYYYY in the following code?
public class WildCardDemo3 {
public static void main(String[] args) {
GenericStack<String> stack1 = new GenericStack<>();
GenericStack<Object> stack2 = new GenericStack<>();
stack2.push("Java");
stack2.push(2);
stack1.push("Sun");
add(stack1,stack2);
WildCardDemo2.print(stack2);
}
public static <T> void YYYYYYYY {
while (!stack1.isEmpty())
stack2.push(stack1.pop());
}
}
A. add(GenericStack<T> stack1,GenericStack<T> stack2)
B. add(GenericStack<? extends T> stack1,GenericStack<T> stack2)
C. add(GenericStack<T> stack1,GenericStack<? super T> stack2)
D. add(GenericStack<T> stack1,GenericStack<Object> stack2)
答案D也行得通吗?我了解stack2是对象类型,但我认为应将其定义为与类型参数有关。抱歉,这是一个愚蠢的问题。
解决方法
选项A不会编译(在add(stack1,stack2)
行),因为在这种情况下,编译器期望两个堆栈严格地具有相同的泛型类型。实际上,我们有String
和Object
并不相同。
选项B编译。有效地变为:
<Object> void add(GenericStack</*String*/ ? extends Object> stack1,GenericStack<Object> stack2)
String
扩展了Object
。满足通配符限制。
选项C编译。有效地变为:
<String> void add(GenericStack<String> stack1,GenericStack</*Object*/? super String> stack2)
Object
是Java中包括String
在内的所有类的超类。满足通配符限制。
选项D编译。有效地变为:
<String> void add(GenericStack<String> stack1,GenericStack<Object> stack2)
Object
类比String
宽。这就是GenericStack<Object> stack2
可以包含GenericStack<String> stack1
中的字符串值的原因。
您是对的,D确实有效。唯一不起作用的是A。 您可以自己编写代码并运行它进行检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。