一直搞不懂泛型中为什么要用通配符? 有什么情况是一定要用到通配符才行的么? 还是说通配符是为了提供方便?
如果是提供方便的话, 提供了什么方便呢?
我写了个小程序里面包含了泛型方法的各种情况, 可是没有找到一种情况是一定要用通配符的. 是不是我试验的不全面?
- public class genericsTest {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Box<String> strBox = new Box<String>();
- Box<Integer> intBox = new Box<Integer>();
-
- strBox.setElement("aa");
- intBox.setElement(123);
-
- unbox1(strBox);
- unbox2(strBox);
- unbox3(strBox);
-
- /*下面语句会报错, 因为intBox中的unbox4方法已经在定义对象时就被参数化了
- intBox.unbox4(strBox);*/
-
- strBox.unbox4(strBox);
- intBox.unbox5(strBox);
- intBox.unbox6(strBox);
- }
-
- //不用通配符的方法 会报警告
- private static void unbox1(Box box){
- System.out.println(box.getElement());
- }
-
- //用泛型参数的方法
- private static <K> void unbox2(Box<K> box){
- System.out.println(box.getElement());
- }
-
- //用通配符的方法
- private static void unbox3(Box<?> box){
- System.out.println(box.getElement());
- }
- // Box<?> 是一个参数类型, <?> 是这个参数类型的一部分. <T>只能用来表示一整个类型.
-
- }
- class Box<T>{
- private T element;
- public T getElement() {
- return element;
- }
- public void setElement(T element) {
- this.element = element;
- }
-
- //泛型对象中的泛型方法
- public void unbox4(Box<T> box){
- System.out.println(box.getElement());
- }
-
- //泛型对象中用独立泛型参数的方法
- public<K> void unbox5(Box<K> box){
- System.out.println(box.getElement());
- }
-
- //泛型对象中用通配符的方法
- public void unbox6(Box<?> box){
- System.out.println(box.getElement());
- }
-
- }
复制代码
除了注释起来的那个错误以外, 其余六个unbox方法的调用的结果都是正确的. |