泛型的本质:类型参数化。
一:泛型的优点:
a, 让我们少写几个类的代码,b,让我们定义安全的泛型类
二:自定义泛型类:
package gen01; /** * 自定义泛型类 BasicController * @author john * * @param <E> * @param <S> */ public class BasicController<E,S> { private E e; //private static S s; //泛型不能定义在静态属性上 public BasicController() { super(); } }
三:自定义泛型接口:
package gen01; /** * 泛型接口 Comparator * @author john * * @param <E> */ public interface Comparator<E> { //接口不能有泛型属性,因为接口的属性是静态的。 // /*public static final*/ E e; //公共的抽象方法 /*public abstract */ E compare(E e); }
四:自定义泛型方法:
package gen01; import java.io.Closeable; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; /** * 非泛型类中定义泛型方法 * @author john * */ public class Method { //自定义泛型方法 //定义: 在返回类型前加上<字母> public static <T> void test(T t){ System.out.println(t); } //自定义释放资源的泛型方法 public static <T extends Closeable> void testClose(T... t){ for(T temp:t){ try { if(null!=temp){ temp.close(); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws FileNotFoundException { test("自定义泛型方法测试"); testClose(new FileInputStream("G:\\aaa.txt")); } }
五:父类为泛型类,子类继承时:
子类为富二代
package gen02; /** * 泛型父类 *1,保留父类泛型,子类必须为泛型。 *2,不保留父类泛型,子类按需实现。 * *属性及方法类型随位置而定 *子类重写方法类型 --->随父类而定 *eg: test 方法的参数 *子类使用父类的属性 --->随父类而定 *eg: this.age; * *子类中使用自己的属性 --->随自己而定 *eg: Child1中的 A sex; * * @author john * * @param <T1> * @param <T2> */ public abstract class Father<T1,T2>{ T1 age; public abstract void test(T2 name); } //保留 //1,全部保留 class Child1<T1,T2,A> extends Father<T1,T2>{ A sex; @Override public void test(T2 name) { T1 t1 = this.age; //---> T1 } } //2,部分保留 class Child2<T2,A> extends Father<Integer,T2>{ @Override public void test(T2 name) { Integer tempAge = this.age; //--->Integer }} //不保留 //1,有具体类型 class Child3 extends Father<Integer,String>{ @Override public void test(String name) { Integer tempAge = this.age; //--->Integer } } //2,没有具体类型 ,擦除 class Child4 extends Father{ @Override public void test(Object name) { Object tempAge = this.age; //--->Object } } //Child4 等价于 class Child5 extends Father<Object,Object>{}
六:接口为泛型接口 实现类实现时:
同上
七:泛型擦除:
泛型擦除指使用|实现|继承的时候没有指定类型,我们称之为泛型擦除。
类似于Object, 不完全等同于Object 不指定类型编译不会自动检查,指定类型后编译会自动检查
package gen02; /** * 泛型擦除 * 泛型擦除指使用|实现|继承的时候没有指定类型 * 类似于Object, 不完全等同于Object 不指定类型编译不会自动检查,指定类型后编译会自动检查 * * @author john */ public class MyStuApp { public static void main(String[] args) { MyStudent myStudent = new MyStudent<>(); myStudent.setAge(18); Object age = myStudent.getAge(); test(myStudent);//不指定类型编译不会自动检查 MyStudent<Object> myStudent2 = new MyStudent<Object>(); //test(myStudent2);//指定类型后编译会自动检查,此处会报错 } public static void test(MyStudent<String> student){ System.out.println(student.getAge()); } } class MyStudent<T>{ T age; public T getAge() { return age; } public void setAge(T age) { this.age = age; } }
八:泛型通配符"?":
表示类型不确定,只能用在声明变量,不能用在定义泛型类、泛型接口、泛型方法上。
package gen03; import java.util.ArrayList; import java.util.List; public class WildcardTest { public static void main(String[] args) { //声明 List<?> lists = new ArrayList<String>(); lists = new ArrayList<Integer>(); lists = new ArrayList<Object>(); //编译错误 通配符不能用来创建对象 //lists = new ArrayList<?>(); } public static void test(List<?> lists){ } //不能用在创建泛型方法 编译通不过 // public static <?> void test2(List<?> lists){ // // } } //不能用在创建泛型类 编译通不过 //class Test<?>{ // //}
九:泛型上限"extends":
一般用于限制操作,表示小于等于,即子类或自身。
不能添加数据进去的理由是:保证向下兼容一致性。
package gen03; /** * 继承链 * Object * | * Fruit * / \ * Apple Pear * | * FujiApple * * @author john * */ public class Fruit {} class Apple extends Fruit{}; class Pear extends Fruit{}; class FujiApple extends Apple{};
package gen03; import java.util.ArrayList; import java.util.List; /** * extends 泛型上限 <= 即子类 * 1,一般使用于限制操作。 * 2,不能使用在添加数据操作 保证向下兼容一致性。 * 3,规则 * * @author john */ public class ExtendsTest { public static void main(String[] args) { //extends 为上限 //1 泛型定义属性 Test<Fruit> test1 = new Test<Fruit>(); Test<Pear> test2 = new Test<Pear>(); Test<Apple> test3 = new Test<Apple>(); //泛型没有多态 下面这行代码编译无法通过 // Test<Apple> test4 = new Test<FujiApple>(); List<? extends Fruit> list1 = new ArrayList<Fruit>(); test(list1); List<Fruit> list2 = new ArrayList<Fruit>(); test(list2); List<Apple> list3 = new ArrayList<Apple>(); test(list3); List<? extends Apple> list4 = new ArrayList<FujiApple>(); test(list4); //? -->为什么报错 因为? 等同于 ? extends Object Object>Fruit 所以报错 List<?> list5 = new ArrayList<FujiApple>(); //test(list5); } //2 使用extends定义泛型方法 ? extends Fruit public static void test(List<? extends Fruit> lists){ //lists 不能添加任何非空对象 进去的理由是:保证向下兼容一致性。 // lists.add(new Fruit()); // lists.add(new Apple()); // lists.add(new Pear()); // lists.add(new FujiApple()); // lists.add(null); } //泛型类 static class Test<T extends Fruit>{} }
十:泛型下限"super":
一般用于限制操作,表示大于等于,即父类或自身。
不用用来添加父类数据进去的理由是:保证向上兼容一致性。
package gen03; /** * 继承链 * Object * | * Fruit * / \ * Apple Pear * | * FujiApple * * @author john * */ public class Fruit {} class Apple extends Fruit{}; class Pear extends Fruit{}; class FujiApple extends Apple{};
package gen03; import java.util.ArrayList; import java.util.List; /** * extends 泛型下限 >= 即父类或自身。 * @author john */ public class SuperTest { public static void main(String[] args) { List<Fruit> list1 = new ArrayList<Fruit>(); test(list1); List<Object> list2 = new ArrayList<Object>(); test(list2); List<Apple> list3 = new ArrayList<Apple>(); test(list3); List<? extends Apple> list4 = new ArrayList<Apple>(); //test(list4); //编译通不过 } // 使用extends定义泛型方法 public static void test(List<? super Apple> lists){ //自能添加自身或者子对对象 不能添加父类对象 理由是:保证向上兼容一致性。 lists.add(new Apple()); lists.add(new FujiApple()); //lists.add(new Fruit());//编译通不过 } }
十一:泛型嵌套:
package gen03; /** * 泛型嵌套 * @author john * */ public class GenericQianTao { public static void main(String[] args) { Student<Integer> student = new Student<Integer>(); student.setScore(100); Class<Student<Integer>> bj = new Class<Student<Integer>>(); bj.setStudent(student); Student<Integer> stu = bj.getStudent(); System.out.println(stu.getScore()); } } class Student<T>{ T score; public T getScore() { return score; } public void setScore(T score) { this.score = score; } } class Class<T>{ T student; public T getStudent() { return student; } public void setStudent(T student) { this.student = student; } }
JDK里面嵌套的典型应用是Map集合遍历时使用Entry时的场景。
泛型没有多态。
没有泛型数组。
jdk1.7对泛型的简化 List<String> lists = new ArrayList<>();
后面的有时间整理下 20160509。
二: 定义泛型:
a,定义单个类型持有者 UserDao<User> userDao = new UserDao<User>();
b,定义多个类型持有者 UserDao<Long,User> userDao = new UserDao<Long,User>();
三:限制泛型的可用类型(有界类型 extends super):
1, extends
a,定义类/接口
public class UserDao<T>{
...
}
与
public class UserDao<T extends Object>{
...
}
是等价的。
所以我们想用限制类型定义类的时候该写成 注意1:不能用将T换成? 程序会报错。可以定义多个类型持有者。
public class UD<T extends Fruit>{
....
}
注意2:public class/interface 父类/父接口名字<T>的子类/子接口/实现类 在继承父类/继承父接口i/实现接口中
写法最好是 public class/interface 子类/子接口名字 extends/implements 父类/父接口名字<User>
或者 public class/interface 子类/子接口名字<E extends BasicTreeEntity> extends/implements 父类/父接口名字<E>
List<? extends Fruit> list1 = new ArrayList<Fruit>();
List<? extends Fruit> list2 = new ArrayList<Apple>();
List<? extends Fruit> list3 = new ArrayList<Orange>();
//list1.add(new Fruit()); // 报错
//list2.add(new Apple()); // 报错
//list3.add(new Orange()); // 报错//list2 list3
//另外一种解释 http://blog.csdn.net/hippoppower/article/details/4473991
c,方法参数 和 返回值类型 理解这种代码的写法 以后自己写代码多用这种.
定义父类型 传参的时候可以传递父类和父类的子类进去。返回实际类型。
调用上面的方法的代码
2,super
a,定义类 没有这种写法
b,定义变量 不理解这里 也不理解这种定义的用处。
List<Fruit> fruitList2 = new ArrayList<Fruit>();
或者
相关推荐
基于java的校园美食交流系统设计与实现.docx
均包含代码,文章,部分项目包含ppt
基于python的酒店评论中文情感分析系统源码+设计文档+数据集.zip基于python的酒店评论中文情感分析系统源码+设计文档+数据集.zip基于python的酒店评论中文情感分析系统源码+设计文档+数据集.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
基于Django框架开发的协同过滤算法小说推荐系统是一种利用用户行为数据来提供个性化小说推荐的应用。该系统通过分析用户的历史阅读记录、评分和反馈,发现用户之间的相似性或小说之间的相似性,进而为用户推荐可能感兴趣的小说。以下是该系统可能包含的关键特性: 1. **用户账户管理**:允许用户创建账户、登录和编辑个人信息,同时跟踪用户的阅读历史和评分。 2. **小说数据库**:构建一个包含大量小说信息的数据库,每本小说都有详细的元数据,如作者、出版年份、流派、标签等。 3. **协同过滤引擎**:实现协同过滤算法,包括用户-用户协同过滤和项目-项目协同过滤,以发现相似用户或相似小说。 4. **推荐生成**:根据协同过滤引擎的结果,生成个性化的小说推荐列表,并提供给用户。 5. **评分系统**:允许用户对小说进行评分,这些评分数据将用于训练推荐算法,提高推荐的准确性。 6. **用户界面**:设计直观、易用的用户界面,使用户能够轻松浏览推荐的小说、查看详情和进行评分。 7. **搜索和筛选功能**:提供强大的搜索功能,允许用户根据标题、作者或流派等关键词搜索小说,并提供筛选
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
内容概要:本文是关于2020年度数字孪生技术的最新进展和发展趋势的研究报告。文中对数字孪生技术及其应用场景作出了详细的阐述,特别强调了数字孪生在智能制造、智慧城市、产品开发等多个领域内的实际应用成果,并讨论了数字孪生带来的信息安全方面的挑战和解决方案。 适用人群:面向希望深入了解和应用数字孪生技术的企业管理人员、研发工程师和学者。 使用场景及目标:适用于企业或机构寻求改进产品设计、生产制造、城市管理等领域效能的情况,助力相关人员理解和实现更加精细的管理决策和模拟预测,进而优化资源配置与提升工作效率。 其它说明:介绍了多项核心技术,包括但不限于数据收集、建模仿真、模型管理系统等,并分享了多个数字孪生的真实应用案例以展示其实效。
基于java的的德云社票务系统的设计与实现.docx
基于java的宜佰丰超市进销存管理系统设计与实现.docx
基于java的削面快餐店点餐服务系统的设计与实现.docx
用户体验分享和讨论.ppt
均包含代码,文章,部分项目包含ppt
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 、3本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 、本项3目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看ReAdmE.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
均包含代码,文章,部分项目包含ppt
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
志愿者招募网站,在网站首页可以查看首页,组织信息,志愿活动,新闻资讯,个人中心,后台管理等内容,并进行详细操作 用户注册,在用户注册页面通过填写账号,密码,确认密码,姓名,手机,所在学校,邮箱,验证码等信息进行注册操作 组织信息,在组织信息页面可以查看组织名称,组织编号,组织宣言,负责人,联系电话等内容,并进行评论和收藏操作 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog
全代码在里面,学完Java实训写出来的Java图书馆代码
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。