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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔九 中级黑马   /  2013-2-23 12:36  /  1671 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;

public class Generics1 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Demo<Integer> d=new Demo<Integer>();
                d.sop(2);
                d.print("shadkjhgvnbkad");

        }

}
class Demo<T>
{
        public static <T>void sop(T t)静态方法不可访问类上定义的泛型为什么加了 <T>可以运行啊
        {
                System.out.println(t);
        }
        public <t>void print(t T)
        {
                System.out.println(T);
        }
}

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

5 个回复

倒序浏览
本帖最后由 李挺 于 2013-2-23 12:43 编辑

静态方法是先于对象存在的
调用这个静态方法的时候,这个方法没法判断参数的约束条件,所以在编译时就报错了。
如果方法是非静态的
对象调用它,编译的时候它就知道这个参数是什么类型的
回复 使用道具 举报
呵呵
  1. public static <T>void sop(T t)静态方法不可访问类上定义的泛型为什么加了 <T>可以运行啊
  2.         {
  3.                 System.out.println(t);
  4.         }
  5. //你这里的<t>就已经表明你定义了一个类型名为t的新类型了,
  6. //然后再参数列表中t T就表示你用这个类型t定义了一个变量T
  7.         public <t>void print(t T)
  8.         {
  9.                 System.out.println(T);
  10.         }
复制代码
,你这里访问的是自己定义的T,它和类上定义的泛型不是一个概念!

评分

参与人数 1黑马币 +12 收起 理由
Rancho_Gump + 12

查看全部评分

回复 使用道具 举报
我的理解是:
1、泛型的作用:主要是给编译器看的,编译后泛型类型限定信息<T>,在编译后被去

掉的。
2、在用应泛型时,被限定类型的类必须是泛型类,如:class Demo <T>{}这就是一

个泛型类。所以当被限定类型的类如果不是泛型类,编译器会报错。
泛型的知识点在张老师的基础加强视频中的泛型中说得很详细,希望对你好帮助!

回复 使用道具 举报
class Demo<Integer>
{
      /*  public static void sop(Integer t)//这样才是静态方法在访问类上定义的泛型,所以会报错。你那样写不是的,其实就是在访问自己定义的泛型所以没什么问题
        {
                System.out.println(t);
        }*/
        public void print(Integer x)//这里访问类定义的泛型就不报错
        {
                System.out.println(x);
        }
}
回复 使用道具 举报
你这个问题有两点,一是泛型方法,二是静态泛型方法。
1.
         
定义泛型方法(在方法的返回值前面加“<T>”)
/**
* 泛型类定义的泛型在整个类中有效,为了让不同方法可以操作不同类型,而且类型不确定,所以可以将泛型定义在方法上。
* 泛型定义在类上和泛型定义在方法上不冲突。
*/
public class GenericDemo {
    public static void main(String[] args) {
       Demo<String> d = new Demo<String>();
       d.show("String类型对象");
       d.show(4);
    }
}
class Demo<T>{
    private T t;
    public void setObject(T t){
       this.t = t;
    }
    //该方法定义了泛型,虽然该方法定义的泛型也为“T”,但是该方法要操作的引用数据类型与整个类要操作的引用数据类型不同。
    public <T> void show(T t){
       System.out.println(t);
    }
}
2.         定义静态泛型方法
/**
* 静态方法不可以访问类上定义的泛型。
* 如果静态方法要操作的应用数据类型不确定,可以将泛型定义在方法上。
*/
public class GenericDemo {
    public static void main(String[] args) {
       Demo<String> d = new Demo<String>();
    }
}
class Demo<T>{
    //静态方法使用了类上定义的泛型,编译不通过。
    public static void method(T t){
       System.out.println(t);
    }
    public static <T> void methodB(T t){
       System.out.println(t);
    }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马