JAVA_静态泛型方法及静态泛型成员变量

#1.泛型类中的静态方法不能使用类的泛型,而应该将该方法定义为泛型方法

1.错误示范:

class demo<T>{
    public static T show(T temp) {
        return temp;
    }
}

2.正确示范:

class demo<T>{
    public static <T> T show(T temp) {
        return temp;
    }
}

3.原因:

   在java中泛型只是一个占位符,必须在传递类型后才能使用。就泛型类而言,类实例化时才能传递真正的类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数时,静态方法就已经加载完成。显然,静态方法不能使用/访问泛型类中的泛型。

这和静态方法不能调用普通方法/访问普通变量类似,都是因为静态申明与非静态申明的生命周期不同。

 

#2.不能定义静态泛型变量

1.原因:

由于静态变量在java程序一运行时就已经被载入内存,而此时它的类型无法确定,而开辟空间必须知道类型,两者矛盾。

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
一、泛型 为什么要有泛型集合(List<T>,Dictionary<K,V>,LinkedList<T>)? 1.为了避免装箱拆箱; 2.复用集合类里的 代码(算法) List<string> List<int> 1.概念 1.1官方:是一种特殊的【算法重用】机制。允许程序员在代码中将 变量或参数的类型 先用【类型占位符】来代替,等到运行的时候再根据传入的【类】来替换 通俗:类也可以带参数了!但是这个参数必须是 类型!用来在 类的代码中 暂时代替 类的位置,然后会在运行时,被替换。 【例子】: public class MyList<T> { T[] arr; public MyList(T[] arrp) { arr = arrp; } } 2.语法 2.1泛型的运行 当 运行的时候,JIT会帮我们生成泛型类的不同版本,通过如下代码可以验证: //aa是MyList中一个int的静态变量 MyList<string>.aa = 11; MyList<int>.aa = 22; //照理说,同为MyList类的静态变量,应该保存最后一次赋值的 22 //但是输出的时候,确实生成了两个不同的版本 Console.WriteLine(MyList<string>.aa.ToString());//11 Console.WriteLine(MyList<int>.aa.ToString());//22 //由此看出,JIT在运行代码的时候,分别为带不同的 泛型参数 的MyList类生成了不同的版本。 MyList<string>.dd = new Dog(); MyList<string>.dd.age = 11; MyList<int>.dd = new Dog(); MyList<int>.dd.age = 22; Console.WriteLine(MyList<string>.dd.age.ToString());//11 Console.WriteLine(MyList<int>.dd.age.ToString());//22 【问题】为什么JIT在执行的是有要根据泛型类 MyList<T>里的T 来产生不同的 MyList类的版本? 因为 只有当T确定为某种类型的时候,JIT才有可能计算出 当前MyList类的对象在内存中要分配多大的空间。 3.泛型约束 3.1基类约束 public class House<TPet,TPet2> where TPet:Dog //约束 TPet必须是 Dog或Dog的子类 where TPet2:Cat //约束 TPet必须是 Cat或Cat的子类 { TPet pet1; TPet2 pet2; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值