泛型的学习
来源:互联网 发布:java lock 编辑:程序博客网 时间:2024/06/06 19:18
最近在看android框架源码中,看到很多使用了
<具体类名称>或者<T><E><符号>...这些格式的代码
凡是代码使用了
<xxx>
这个格式,那么别多想了,一定是使用了泛型。。。
看了一篇不错的文章:
http://www.cnblogs.com/lwbqqyumidi/p/3837629.html
学习总结:
1、
使用其实只要2中
T 某个具体泛型 类
? 所有泛型 类
使用格式主要:new 类名<xxx>class 类<xxx>interface 名称<xxx>参数 T t;方法 public T getName(){ ...return T;}
在创建类的时候指定了泛型,和创建的类没有半毛钱关系,
public class Studnet<T>{...}
上面代码,T和Student没有直接关系。
在student类中,
可能有方法返回类型是 T,
参数类型是 T,
也可能根本没有使用T。
如果出现T,那么所有的T都是一样的,同一个类型!!!
public class Student<T> { T id;// int age; public Student(T id, int age) {//T super(); this.id = id; this.age = age; } public Student(T id) { // TODO Auto-generated constructor stub this.id = id; } public T getId() { return id; } public void setId(T id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
测试:
import java.util.ArrayList;import java.util.List;public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Student s; Student<Integer> student = new Student(); //指定了T是Integer student.setId("1"); /*出错, The method setId(Integer) in the type Student<Integer> is not applicable for the arguments (String) */ }}
正确写法:
Student<Integer> student = new Student(); student.setId(100);
要是我同时指定id 是 int 或者double、float ,更牛逼的是id可以是任何类型,怎么办啊????
import java.util.ArrayList;import java.util.List;public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Student<String> student0 = new Student(); student0.setId("123"); Student<Integer> student1 = new Student(); student1.setId(123); Student<Double> student2 = new Student(); student2.setId(123d); Student<Float> student3 = new Student(); student3.setId(123f); student0.getId(); student1.getId(); student2.getId(); student3.getId(); }}
比如,4种类型,那我就要写4个getId( );
这也太麻烦了吧。。。
答案就是泛型通配符!!!
简化:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Student<String> student0 = new Student(); student0.setId("123"); getStuId(student0); // Student<Integer> student1 = new Student(); student1.setId(123); getStuId(student1); // Student<Double> student2 = new Student(); student2.setId(123d); getStuId(student2); // Student<Float> student3 = new Student(); student3.setId(123f); getStuId(student3); } private static void getStuId(Student<?> student) { System.out.println(student.getId().getClass()); }}打印:class java.lang.Stringclass java.lang.Integerclass java.lang.Doubleclass java.lang.FloatStudent<?> student 这个对象可以理解成是所有具体泛型对象的 父类!!!!!!!!!!!!!!!!!貌似只能在方法参数中使用????????????类型通配符一般是使用 ? 代替具体的类型实参。注意了,此处是类型实参,而不是类型形参!
如果你想过滤一下通配符代表的类
使用
<? extends xxxx类> private static void getStuId(Student<? extends Number> student) {。。。}这个时候 Student<String> student0 = new Student(); student0.setId("123"); getStuId(student0); 报错 The method getStuId(Student<? extends Number>) in the type Test is not applicable for the arguments (Student<String>)
扩展
泛型不支持数组
//Cannot create a generic array of Student<String> Student<String>[] stuArray=new Student<String>[100];修改: Student<Integer>[] stuArray=new Student[100]; stuArray[0].setId(123);//必须是Integer
这里你可能会想,那我在创建类的时候直接用调配符不就好了,支持各种类型自动转化 啊,我试过了不行!!!
//Syntax error on token "?", invalid TypeParameterpublic class Student<?> {...}
报错啦,只能给具体的类或者T、E、a,b,c,e,d 等字母!!!!
就是不能使用通配符,通配符在
传入方法参数中使用!!!
在方法返回值类型中也不支持通配符!!!
public ? getId() { return id; }
Multiple markers at this line
- Syntax error on token “?”, delete this
token
好了,就这些,你看List、各种框架源码中涉及的也就这些吧。。。
拜拜
2017/6/23
一个类创建的时候包含泛型,我们再new 类的时候可以不带泛型,
当调用类中方法设计到泛型,会自动识别转换。
上面的student例子:
public static void main(String[] args) { // TODO Auto-generated method stub /*Student is a raw type. References to generic type Student<T> should be parameterized*/ Student student = new Student(); student.setId(123d); getStuId(student); 。。。}打印class java.lang.Double
- 泛型的学习
- 泛型的学习
- c# 泛型的学习
- 泛型的学习小结
- java泛型的学习
- JAVA泛型的学习
- JAVA泛型的学习
- JAVA泛型的小学习
- 学习泛型的方法总结
- java学习:泛型的基础知识
- 泛型的入门学习及思考
- 黑马程序员---泛型的学习
- 黑马程序员---泛型的学习2
- JAVA学习:泛型的必要性
- 泛型技术的三个学习阶段
- 基础加强—泛型的学习
- java泛型的学习总结
- java泛型的深入学习
- 基于Qt Quick与opencv实现的图像处理系统
- CentOS 7 安装mesos
- 解决方案!! java.lang.NoClassDefFoundError: javax/el/ELResolver
- 程序员有用网站集(干货)
- 在APACHE服务器上的访问方式上去除index.php
- 泛型的学习
- Adaboost 算法总结
- 素数距离问题
- C# 二进制BinaryFormatter进行序列化与反序列化
- 来电中断在app中断测试的解决方案
- 简单使用技巧 隐藏键盘, 判断软键盘是否打开. edittext解决第二次点击获取焦点
- Tomcat源码分析-JMX(上)
- 字符串过滤
- Ubuntu中安装git与使用方法