A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lwy0319 高级黑马   /  2014-3-23 01:29  /  1304 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 lwy0319 于 2014-3-23 01:51 编辑

大家好,目前在学泛型关于通配符存在的必要性暂时不是很了解希望大家能够帮我看看
  1. class Info<T>{
  2.         private T var;
  3.         public void setVar(T var){
  4.                 this.var=var;
  5.         }
  6.         public T getVar(){
  7.                 return this.var;
  8.         }
  9.         
  10. }
  11. public class Text4 {
  12.         public static void main(String[] args){
  13.                 Info<String> a=new Info<String>();
  14.                 Info<Object> b=new Info<Object>();
  15.                 Info<Integer> c=new Info<Integer>();
  16.                 a.setVar("黑马程序员");
  17.                 b.setVar("黑马");
  18.                 c.setVar(30);
  19.                 fun(a);
  20.                 fun(b);
  21.                 fun(c);
  22.         }
  23.         public static<T> void fun(Info<T> a){
  24.                 System.out.println(a.getVar());
  25.         }
  26. }
复制代码

书上关于通配符的用法主要是public static void fun(Info<?> a)因为如果不加<?>会有编译警告,我同样不太了解这部分编译警告有什么影响。。。然后根据泛型方法修改之后警告没了,程序运行也没问题。。所以对它存在的必要性作用就没搞懂了。。哪位同学能帮我举个例子告诉我在哪里它有着必要性的存在么。。或者它是最优选择也行。。PS:顺便问下,泛型有同时设上下限的解决方案么?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

1 个回复

倒序浏览
首先 public static<T> void fun(Info<T> a){
这个方法定义了泛型,如何确定这个方法到底是什么泛型呢? 这就必须在调用方法时传入这个泛型,所以括号里的Info必须有泛型。 不加泛型肯定报错。意思是你Info<String> a  你要传入这个参数,肯定要告诉方法这个泛型是String。 如果你觉得没必要,那么Info这个对象本身就是不确定泛型的,Info你定义了Object Integer String这就等于是不同的参数类型了。。。如果不定义泛型,那就定义可以变参数,那显然不是这个程序的意思。


为了让不同方法可以操作不同类型,而且类型还不确定。
那么可以将泛型定义在方法上。(泛型方法)

根据你的第二个问题,
? extends E: 可以接受E类型或者E的子类型。 上限。
* ?  super  E: 可以接受E类型或者E的父类型。下限。

当你传入的参数是一个有继承的关系的时候,就可以考虑  public static void fun(Info<? extends T> a){
了,对于你这个程序,我觉得就可以这么写。因为你泛型都是Object的子类。 但是如果Info泛型是int 或者其他基本类型,就只有用上面那个方法了。基本类型貌似没有上限和下限,他们不属于object

      

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马