泛型的几种用法与集合安全问题
2020-07-30 13:37
148 查看
泛型
- Java泛型是JDK1.5中引入的新特性,其本质就是参数化类型,把类型作为参数进行传递。
- 常见形式有泛型、泛型接口,泛型方法。
- 语法** <T…>** T成为占位符,表示一种引用类型
- 好处
-
提高代码的重用性
- 防止类型转换异常,提高代码的安全性
泛型类
-
泛型类:
语法:类名 <T>
T是类型占位符,表示一种引用类型,如果编写多个使用逗号隔开
- 泛型只能是引用类型
- 不同泛型类型对象之间不能相互复制
package com.list.demo.generic; public class GenericClass<T> { /* * 泛型类: * 语法:类名<T> T是类型占位符,表示一种引用类型,如果编写多个使用逗号隔开 * */ // 1.使用泛型T // 1.创建变量 T t; // 2.泛型作为方法的参数 public void setT(T t) { this.t = t; } // 3.泛型作为方法的返回值 public T getT(){ return t; } }
package com.list.demo; import com.list.demo.generic.GenericClass; public class Demo4 { public static void main(String[] args) { // 注意:1.泛型只能是引用类型 2.不同泛型类型对象之间不能相互复制 GenericClass<String> stringGenericClass = new GenericClass<>(); stringGenericClass.setT("泛型"); System.out.println(stringGenericClass.getT()); GenericClass<Integer> integerGenericClass = new GenericClass<>(); integerGenericClass.setT(100); System.out.println(integerGenericClass.getT()); } }
泛型接口
-
泛型接口:
语法:接口名<T>
注意:不能创建泛型静态变量
package com.list.demo.generic; /* * 泛型接口: * 语法:接口名<T> 注意:不能创建泛型静态变量 * */ public interface GenericInterface<T> { // static T t; // 会报错,因为静态变量是先加载的,无法预知类型 T server(T t); }
package com.list.demo; import com.list.demo.generic.GenericInterface; public class Demo6Impl<T> implements GenericInterface<T> { @Override public T server(T t) { return t; } }
package com.list.demo; import com.list.demo.generic.GenericInterface; public class Demo5Impl implements GenericInterface<String>{ @Override public String server(String s) { return s; } public static void main(String[] args) { Demo5Impl demo5 = new Demo5Impl(); System.out.println(demo5.server("你好")); Demo6Impl<Integer> integerDemo6 = new Demo6Impl<>(); System.out.println(integerDemo6.server(100)); } }
泛型方法
- 泛型方法: 语法 <T> 返回值类型
package com.list.demo; public class Demo7 { public static void main(String[] args) { Demo7 demo7 = new Demo7(); demo7.show("你好"); // 泛型方法不需要我们传参数类型,它会根据我们传的参数自动匹配 demo7.show(100); demo7.show(3.14); get(1); get("!!!"); get(3.1415926535); } public static <T> T get(T t) { System.out.println(t); return t; } public <T> T show(T t) { System.out.println(t); return t; } }
泛型集合
-
概念:参数化类型,类型安全的集合,强制集合元素的类型一致。
-
特点:
编译时即可检查,而非运行时抛出异常 - 访问时,不必进行类型转换(拆箱)
- 不同泛型之间引用不能相互赋值,泛型不存在多态。
我们之前Demo写的集合没有用泛型强制类型,这样的集合是不安全的
package com.list.demo; import java.util.ArrayList; public class Demo8 { public static void main(String[] args) { ArrayList arrayList = new ArrayList<>(); arrayList.add(10); arrayList.add(3.14); arrayList.add("10"); for (int i = 0; i <arrayList.size() ; i++) { // ClassCastException 这种集合是不安全的 String s = (String) arrayList.get(i); System.out.println(); } } }
- 为了使得我们的集合更加安全,程序更加健壮,我们要将泛型加上
package com.list.demo; import java.util.ArrayList; public class Demo9 { public static void main(String[] args) { ArrayList<Integer> integers = new ArrayList<>(); integers.add(100); // integers.add(3.14); // 报错 // integers.add("100"); // 报错 integers.add(50); integers.add(80); for (int i = 0; i < integers.size(); i++) { Integer integer = integers.get(i); System.out.println(integer); } } }
相关文章推荐
- 【转】关于flex的安全沙箱问题+安全策略文件的用法
- 编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]
- android app -- 关于listview的几种用法(复用,不复用,半复用)解决item状态改变的问题
- JS窗口问题处理:使弹出窗口保持前端显示的几种方法,及window窗体对象open()和showModalDialog()用法
- 解决VS2017中使用fopen函数出现安全问题的方法(尝试过好几种方法终于解决了,绝对有用)
- C# List泛型集合中的GroupBy<>用法
- js封装 与 js高级用法 问题集合
- 【转】java 泛型的几种用法
- 集合的线程安全问题
- 计算字符串中每种字符出现的次数[Dictionary<char,int>泛型集合用法]
- Java集合的线程安全用法
- 随机数的种子问题、泛型集合:list Dictionary、字典Dictionary【充实的一天~!】
- 黑马程序员_List泛型集合如Dictionary键值对集合的一些用法
- JS窗口问题处理:使弹出窗口保持前端显示的几种方法,及window窗体对象open()和showModalDialog()用法
- C# 泛型集合中的GroupBy<>用法
- JS窗口问题处理:使弹出窗口保持前端显示的几种方法,及window窗体对象open()和showModalDialog()用法
- 编写高质量代码改善C#程序的157个建议[泛型集合、选择集合、集合的安全]
- 集合框架_通过Object转型问题引入泛型
- C# List泛型集合中的GroupBy<>用法
- 04.多线程--04.【多线程卖票出现的数据安全问题】【同步代码块基本用法和原理】