- 浏览: 195307 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (321)
- eclipse (4)
- idea (2)
- Html (8)
- Css (14)
- Javascript (8)
- Jquery (6)
- Ajax Json (4)
- Bootstrap (0)
- EasyUI (0)
- Layui (0)
- 数据结构 (0)
- Java (46)
- DesPattern (24)
- Algorithm (2)
- Jdbc (8)
- Jsp servlet (13)
- Struts2 (17)
- Hibernate (11)
- Spring (5)
- S2SH (1)
- SpringMVC (4)
- SpringBoot (11)
- WebService CXF (4)
- Poi (2)
- JFreeChart (0)
- Shiro (6)
- Lucene (5)
- ElasticSearch (0)
- JMS ActiveMQ (3)
- HttpClient (5)
- Activiti (0)
- SpringCloud (11)
- Dubbo (6)
- Docker (0)
- MySQL (27)
- Oracle (18)
- Redis (5)
- Mybatis (11)
- SSM (1)
- CentOS (10)
- Ant (2)
- Maven (4)
- Log4j (7)
- XML (5)
最新评论
1. Java中Generics泛型
2. 自定义泛型
3. 泛型的泛型
4. 泛型上下边界
Generics泛型是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 import java.util.ArrayList; import java.util.List; public class ArrayListTest{ public static void main(String[] args){ List list = new ArrayList(); list.add("string"); list.add(new Integer(2)); list.add(new Boolean(false)); String str = (String)list.get(0); Integer in = (Integer)list.get(1); String b = (String)list.get(2); } } 运行结果: Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String at org07.ArrayListTest.main(ArrayListTest.java:18)
2. 自定义泛型
自定义泛型,可以定义多个泛型Generic<T1, T2>,用set和get方法实现。 public class Generic<T1, T2>{ private T1 foo1; private T2 foo2; public T1 getFoo1(){ return foo1; } public void setFoo1(T1 foo1){ this.foo1 = foo1; } public T2 getFoo2(){ return foo2; } public void setFoo2(T2 foo2){ this.foo2 = foo2; } public static void main(String[] args){ Generic<Integer, Boolean> foo = new Generic<Integer, Boolean>(); foo.setFoo1(new Integer(-20)); foo.setFoo2(new Boolean(false)); System.out.println(foo.getFoo1()); System.out.println(foo.getFoo2()); } } 运行结果: -20 false 泛型数组的存取 public class Generic2<T>{ private T[] fooArray; public T[] getFooArray(){ return fooArray; } public void setFooArray(T[] fooArray){ this.fooArray = fooArray; } public static void main(String[] args){ Generic2<String> foo = new Generic2<String>(); String[] str1 = {"hello", "world", "welcome"}; String[] str2 = null; foo.setFooArray(str1); str2 = foo.getFooArray(); for(int i = 0; i < str2.length; i++){ System.out.println(str2[i]); } } } 运行结果: hello world welcome
3. 泛型的泛型
public class WrapperFoo<T>{ private GenericFoo3<T> foo; public GenericFoo3<T> getFoo(){ return foo; } public void setFoo(GenericFoo3<T> foo){ this.foo = foo; } public static void main(String[] args){ GenericFoo3<Integer> foo = new GenericFoo3<Integer>(); foo.setFoo(new Integer(-10)); WrapperFoo<Integer> wrapper = new WrapperFoo<Integer>(); wrapper.setFoo(foo); GenericFoo3<Integer> g = wrapper.getFoo(); System.out.println(g.getFoo()); } } class GenericFoo3<T>{ private T foo; public T getFoo(){ return foo; } public void setFoo(T foo){ this.foo = foo; } } 运行结果: -10
4. 泛型上下边界
限制泛型的类型用extends关键字。ListGenericFoo<T extends List> 当我们没有指定泛型的类型或接口时,默认使用T extends Object,任何类型都可以作为参数传入。 import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; public class ListGenericFoo<T extends List>{ private T[] fooArray; public T[] getFooArray(){ return fooArray; } public void setFooArray(T[] fooArray){ this.fooArray = fooArray; } public static void main(String[] args){ ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>(); ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>(); LinkedList[] linkedList = new LinkedList[10]; foo1.setFooArray(linkedList); ArrayList[] arrayList = new ArrayList[10]; foo2.setFooArray(arrayList); // ListGenericFoo<HashMap> foo3 = new ListGenericFoo<HashMap>(); } } GenericTest<? extends List> 在声明引用的时候才对泛型进行限定。 GenericTest<? super List> 在声明引用的时候才对泛型进行限定。(在List之上的泛型) import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class GenericTest<T>{ private T foo; public T getFoo(){ return foo; } public void setFoo(T foo){ this.foo = foo; } public static void main(String[] args){ GenericTest<? extends List> ge = null; ge = new GenericTest<ArrayList>(); ge = new GenericTest<LinkedList>(); // ge = new GenericTest<HashMap>(); GenericTest<? super List> ge2 = null; ge2 = new GenericTest<Object>(); GenericTest<String> ge3 = new GenericTest<String>(); ge3.setFoo("hello world"); GenericTest<?> ge4 = ge3; System.out.println(ge4.getFoo()); ge4.setFoo(null); System.out.println(ge4.getFoo()); // ge4.setFoo("welcome"); } } 运行结果: hello world null ge4.setFoo("welcome");是错误的。因为需要强制类型转换。不符合泛型定义。 使用<?>或是<? extends SomeClass>的声明方式,意味著您只能通过该名称來取得所参考实例的信息,或者是移除某些信息,但不能增加它的信息,因为只知道当中放置的是SomeClass的子类,但不确定是什么类的实例,编译器不让您加入信息,理由是,如果可以加入信息的話,那么您就得記得取回的实例是什么类型,然后转换为原來的类型方可进行操作,这就失去了使用泛型的意义。
发表评论
-
Java中获取IP地址、子网掩码、网关地址
2019-06-26 10:53 01. Java中获取IP地址、子网掩码、网关地址、ping连通 ... -
Java中ThreadLocal
2019-04-19 10:44 01. Java中ThreadLocal Java中的Th ... -
Java中原子性锁synchronized、Lock
2019-04-18 15:19 01. synchronized依赖JVM 1) 修饰代码 ... -
Java中原子性Atomic
2019-04-18 14:45 01. Atomic包简介 java.util.concu ... -
开发常用链接
2019-03-26 11:21 0在线工具:http://tool.oschina.net/ ... -
java1234学习目录
2019-03-21 11:08 01-01-01 N01 J2SEv2(41课时) ... -
Java中TCP和UDP
2018-10-25 10:55 3591. 网页内容获取 Url1.java impor ... -
Java中Thread线程
2018-10-25 09:38 3991. 实现线程的两种方式 1. 继承Thread类并重写 ... -
Java中serializable序列化
2018-10-24 14:46 4891. 序列化 transient不会被序列化。 imp ... -
Java中CharSet集
2018-10-24 11:31 5571. CharSet集 import java.nio. ... -
Java中RandomAccessFile类
2018-10-24 11:30 5211. RandomAccessFile类 1. 使用Ra ... -
Java中I/O的字符流InputStreamReader和OutputStreamWriter
2018-10-22 09:43 4531. InputStreamReader和OutputStre ... -
Java中其它输入输出流
2018-10-22 09:08 4831. ByteArrayInputStream流 以ar ... -
Java中I/O的OutputStream流
2018-10-22 08:54 4971. Java中I/O的OutputStream流 1. ... -
Java中I/O的InputStream流
2018-10-22 08:42 4791. Java中I/O的InputStream流 1. ... -
Java中I/O的File类
2018-10-19 13:45 4541. Java中I/O的File类 1. 在window ... -
Java中innerClass内部类
2018-10-18 09:37 4641. Java中innerClass内部类 用AA.BB ... -
Java中adapter适配器
2018-10-18 08:36 5961. Java中adapter适配器 适配器adapte ... -
Java中awt包
2018-10-17 11:26 17271. Java中awt包 AWT事件模型Event 1 ... -
Java中frame对象
2018-10-17 10:56 6961. Java中frame对象 1. Frame对象 ...
相关推荐
通过阅读"Java Generics and Collections",开发者不仅可以掌握Java泛型和集合的基本使用,还能深入了解它们的高级特性和最佳实践,从而在实际项目中编写出更高质量的代码。这本书对于Java程序员来说是一份宝贵的...
6. **协变和逆变**:理解如何在泛型中实现类型参数的协变和逆变。 7. **比较和equals**:在泛型上下文中正确地实现Comparable和equals()方法。 8. **枚举类型与泛型**:结合使用枚举和泛型来增强类型安全。 通过...
Java 1.5引入了泛型(Generics)的概念,这是一个重要的语言特性,它允许开发者在编译时期指定集合或其他数据结构中的元素类型,从而避免了运行时期的类型转换错误。通过使用泛型,开发者可以在编程阶段就确保类型的...
泛型是Java编程语言中的一个重要特性,它允许程序员在定义类、接口以及方法时使用类型参数,从而提高代码的重用性和安全性。泛型的主要目标是实现类型安全,避免在运行时进行强制类型转换,同时提供编译时的类型检查...
在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...
这个压缩包文件"Generics"可能包含了多个示例,用于演示和解释泛型在Java中的应用。 泛型引入于Java 5,它的主要目标是提供编译时的类型检查,避免了类型转换的麻烦,并且能够减少运行时错误。下面我们将详细讨论...
- `extends`关键字在泛型中的作用不是表示继承,而是用来限定类型参数的范围。例如,`List<? extends Number>`表示列表中的元素是Number或者其子类。 4. **泛型与数据类型转换** 泛型的主要优点之一是自动类型...
泛型是Java编程语言中的一个重要特性,首次引入于JDK 1.5版本。它允许在定义类、接口和方法时使用类型参数,从而增强了代码的类型安全性和可读性。泛型的主要目的是减少类型转换的繁琐过程,并在编译阶段捕获潜在的...
随着JDK 1.5的发布,Java编程语言引入了一系列重要扩展,其中最显著的特点之一便是泛型(Generics)。本文将详细介绍Java中的泛型概念及其应用。无论您是否熟悉其他编程语言中的类似结构,如C++的模板,都将通过本文...
泛型(Generics)是Java SE 5.0版本引入的特性,它允许在编译期间进行类型检查和类型转换,提高代码的复用性和类型安全。 Java集合框架包含了一系列接口,最顶端的是Collection接口。Collection接口定义了一系列...
Java泛型(Generics)是一种在编译时确保类型安全的机制,它允许程序员编写类型安全的通用类或方法,而无需进行显式的类型转换。在Java 1.5引入泛型之前,集合类(如`ArrayList`)只能存储`Object`类型的元素。这...
- `extends` 关键字在泛型中的作用是限定类型参数的范围,如 `List<T extends Number>` 表示 `T` 必须是 `Number` 或其子类。 4. **泛型与数据类型转换** - 泛型的主要优点之一是消除显式类型转换的需求。在泛型...
Java中的泛型是一种类型安全机制,允许在编译时检查类型错误,同时避免了运行时类型转换的开销。通过泛型,可以创建参数化类型,即类型参数(如`<T>`),这使得同一段代码能够处理不同类型的对象,提高了代码的重用...
Java 中泛型总结是指在 Java 语言中使用泛型(generics)来实现编译时类型安全检测机制,避免向下转型的隐患。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。在 Java 中,泛型可以用于定义类...