Java 泛型:如何捕获通配符?

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

不,这个问题不是关于两者之间的区别?和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 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
声明的类型参数绑定,其中as
bar
由为方法声明的类型参数绑定。

创建一个方法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);
    }
}