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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于星星 中级黑马   /  2012-7-14 21:08  /  2433 人查看  /  10 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于星星 于 2012-7-17 10:25 编辑
  1. public class GenericTest {
  2. public static void main(String[] args) {
  3. GenericTest gt= new GenericTest ();
  4. GenericShow gs = new GenericShow ();
  5. gs.setA("对GenericShow类中方法的调用");
  6. gt.fun(gs);
  7. }
  8. public static void fun(GenericShow <? extends Number> c) {
  9. System.out.println(c.getA());
  10. }
  11. }
  12. class GenericShow<D> {
  13. private D a;

  14. public D getA() {
  15. return a;
  16. }

  17. public void setA(D a) {
  18. this.a = a;
  19. }
  20. }
复制代码
在gs.setA("对ShowGeneric类中方法的调用"); gt.fun(b);实参b为什么能够成功的传给public static void fun(ShowGeneric<? extends Number> c) 形参c;

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
没看懂,b哪来的?
回复 使用道具 举报
泛型不能这么写


泛型类创建对象的时候一定要确定类型,不然会出"未经检查"的警告
GenericShow gs = new GenericShow ();

如果gs对象的泛型确定类型为String
gt.fun(gs); 会报错



如果gs泛型确定为Number或其子类
gs.setA("对GenericShow类中方法的调用"); 会报错

点评

泛型可以这么写,因为JDK1.5要兼容老版本的代码。只不过会出现一些警告而已。  发表于 2012-7-16 09:34
我认为此处上限类型Number不与整个程序有任何关系,它只是干扰信息,因为始终未声明Number类及其子类,可以直接把<? extends Number>理解为任意操作类型   发表于 2012-7-15 00:55
回复 使用道具 举报
我顶!哈哈
回复 使用道具 举报
周刚 发表于 2012-7-14 22:56
我顶!哈哈

哈哈哈哈
回复 使用道具 举报
{:soso_e103:}继续顶
回复 使用道具 举报
  1. void fun(GenericShow <? extends Number> c)/*? extends Number表示该类型为Number任何已实现的子类类型*/

  2. gt.fun(gs); gs类型为GenericShow类型,形参c就是GenericShow类型,因此传递的实参没有不妥

复制代码
回复 使用道具 举报
柯玲 中级黑马 2012-7-15 00:50:33
8#
综合观察,示例可以简化解释如下:
  1. public class GenericTest {
  2.         public static void fun(GenericShow <? extends Number> c) { //此刻限定了GenericShow操作类型为 <? extends Number>
  3.             System.out.println(c.getD());
  4.         }
  5.         public static void main(String[] args) {
  6.                 GenericShow gs = new GenericShow ();
  7.                 gs.setD("对GenericShow类中方法的调用");
  8.                 fun(gs); //等同于同类型对象赋值,将类型限定联系起来,以此判断GenericShow的操作类型为 <? extends Number>
  9.         }
  10. }
  11. class GenericShow<D> { //D是不明确的类型,此时就相当于通配符?,由此知道任意类型都可以传入作限定,可以在调用或者创建此类对象时进行限定
  12.     private D d;
  13.         public D getD() {
  14.         return d;
  15.         }
  16.         public void setD(D d) {
  17.         this.d = d;
  18.         }
  19. }
复制代码
综上不难理解gs能顺利将值传给c的原因
回复 使用道具 举报
柯玲 中级黑马 2012-7-15 22:50:22
9#
本帖最后由 柯玲 于 2012-7-16 06:54 编辑

今天看了泛型的高新视频,gs能顺利传给c的原因是因为JAVA程序员为保证JDK1.4代码的可读性,JDK1.5有一个规范“参数化类型与原始类型相兼容”
我们只看这三句:GenericShow gs = new GenericShow (); 表明gs是原始类型;
static void fun(GenericShow <? extends Number> c){...}:将泛型类型GenericShow<D>定义为具体的参数化类型GenericShow<? extends Number>
fun(gs); 类似于GenericShow <? extends Number> c=gs,即原始化类型指向参数化类型,gs就能顺利传值给c.

具体的<? extends Number>只是一个实际类型参数,用作具体类型限定GenericShow,与要传入的类型是不是Number及其子类无关

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 贾存双 于 2012-7-16 05:08 编辑

形参c只是引用了实参b的地址,并不是赋值啊!
回复 使用道具 举报
许瑞航 发表于 2012-7-14 21:50
泛型不能这么写

我试了、、 确实会报错哇、、
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马