Java 泛型:如何捕获通配符?
不,这个问题不是关于两者之间的区别?和T;这是关于我如何变成一个<?>参数转换为命名的Java 泛型:如何捕获通配符?,java,generics,Java,Generics,不,这个问题不是关于两者之间的区别?和T;这是关于我如何变成一个参数转换为命名的。 考虑这个示例代码: import java.io.Serializable; class A<T extends Serializable> { <S extends Serializable> void bar(S arg) { } void bar2(T arg) { } } public class B { A<? extends Serializa
import java.io.Serializable;
class A<T extends Serializable> {
<S extends Serializable> void bar(S arg) { }
void bar2(T arg) { }
}
public class B {
A<? extends Serializable> myA = null;
<T extends Serializable> void foo(T arg) {
myA.bar(arg);
myA.bar2(arg);
}
}
import java.io.Serializable;
甲级{
空条(S arg){}
void bar2(T arg){}
}
公共B级{
A你陷入了死胡同
A<? extends Serializable> myA = ...;
所以foo()
接受任何可序列化的:字符串、整数、香蕉、苹果、任何东西。假设它是以Integer
作为参数调用的
myA.bar2(arg);
因此,基于上述假设,这将调用bar2()
使用整数作为参数,尽管myA
是编译器无法接受的a
。这显然不是类型安全的。B
必须是通用的。@JBNizet已经解释了为什么不能这样做。这个答案旨在解释您可能拥有的选项(在你的问题中,其中一个被正确地指出,但这不是唯一的选择)
使B采用类型参数
class B<T extends Serializable> {
A<T> myA = null;
void foo(T arg) {
myA.bar(arg);
myA.bar2(arg);
}
}
B类{
A myA=null;
无效foo(T参数){
myA.bar(arg);
myA.bar2(arg);
}
}
使B从A延伸(如果B通过A的is-A测试)
B类扩展了A类{
公共void foo(字符串参数){
bar2(arg);
酒吧(1);
}
}
两个选项之间的区别在于1)bar
和bar2
都需要传递相同的类型,其中如2所示bar
和bar2
可以传递不同的类型,因为bar2
由为A
声明的类型参数绑定,其中asbar
由为方法声明的类型参数绑定。创建一个方法h一个类似的签名,并用它来捕获通配符。@ck我不得不承认,我已经盯着我的代码看了一个多小时了;我想我正在“看不见泛型”-那么你介意提供一些示例代码吗?我现在看不到关于<和>的任何左或右…你是对的。这不像我想象的那么容易。这个问题似乎被你忽略了:)不客气。但我想你不会发现太多问题来自我这边,我忘记接受答案。但我会的ng也要检查;-)
myA.bar2(arg);
class B<T extends Serializable> {
A<T> myA = null;
void foo(T arg) {
myA.bar(arg);
myA.bar2(arg);
}
}
class B extends A<String> {
public void foo(String arg) {
bar2(arg);
bar(1);
}
}