在学习Java泛型的过程中,我们常常看到这样泛型的使用, class Person<E extends Number>, 这个表示什么呢,这个其实就是java 泛型的upper bound(上限界定),它给我们带来了什么呢?实际上,它定义了以下3个内容:
- 限定了一组可用于实例化泛型参数的类型。
- 能够访问基类所定义的所有非private成员(方法以及属性)。
- 在编译成字节码时,用基类代替所有的占位符E。
先来看第一点,E extends Number表示在实例化这个类型参数的时候,只能使用Number的子类进行实例化。如:
Person p1= new Person<Long>();// ok
Person p2=new Person<String>();//wrong
因为String并不是Number的子类,所以在进行实例化E类型参数时,编译器会提示错误。
对于第二点,我们看个例子,首先定义一个父子关系,Animal和AnimalSub,并在Animal中分别定义public/protected/private方法两份,一份对应于static,另一份对应于非static
Animal Class:
public class Animal {
public static void staticPublicMethod() {
System.out.println("staticPublicMethod");
}
protected static void staticProtectedMethod() {
System.out.println("staticProtectedMethod");
}
private static void staticPrivateMethod() {
System.out.println("staticPrivateMethod");
}
public void publicMethod() {
System.out.println("publicMethod");
}
protected void protectedMethod() {
System.out.println("protectedMethod");
}
private void privateMethod() {
System.out.println("privateMethod");
}
}
AnimalSub class:
public class AnimalSub extends Animal {
}
然后我们来使用这个泛型的上限界定符,
public class Person <E extends Animal>{
private E e;
public Person(E animal)
{
e=animal;
}
public void invokeNumberMethod()
{
e.staticPublicMethod();
e.staticProtectedMethod();
e.publicMethod();
e.protectedMethod();
}
}
从Person类可以看出,除了Animal中的private的方法,我们都可以进行调用,属性成员类似。这里E代表Animal的子类或者Animal本身,与类的extends有些差别。
第三点是在编译器将java代码编译成字节码的时候,会使用上限界定的基类把占位符都替换掉,对于上面的Person类,编译后,实际上就是:
public class Person {
private Animal e;
public Person(Animal animal)
{
e=animal;
}
public void invokeNumberMethod()
{
e.staticPublicMethod();
e.staticProtectedMethod();
e.publicMethod();
e.protectedMethod();
}
}
可以看出,原先的占位符E都被Animal所代替了。
分享到:
相关推荐
Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...
Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入,极大地增强了代码的类型安全性和重用性。泛型允许我们在编写类、接口和方法时指定参数化类型,使得代码在编译时期就能捕获类型错误,...
Java 泛型详解 Java 泛型是 Java SE 5.0 中引入的一项特征,它允许程序员在编译时检查类型安全,从而减少了 runtime 错误的可能性。泛型的主要优点是可以Reusable Code,让程序员编写更加灵活和可维护的代码。 ...
思维导图之Java泛型详解
Java泛型技术的发展历程及其在JDK1.4中的实现,是IT领域特别是软件开发与设计中的一个重要里程碑。本文将深入探讨泛型技术的概念、历史背景、与其它编程概念的区别,以及其在Java语言中的具体应用。 ### 泛型技术...
1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....
Java 泛型是Java SE 5.0引入的一项重要特性,极大地增强了代码的类型安全性和重用性。泛型方法是泛型技术在类方法层面的应用,它允许我们定义一个可以处理多种数据类型的通用方法。下面我们将深入探讨Java泛型方法的...
Java 泛型是Java SE 5.0引入的一项重要特性,极大地增强了代码的类型安全性和重用性。泛型接口是泛型在接口中的应用,它允许我们在接口中定义带有类型参数的方法,使得实现该接口的类可以使用不同的数据类型。下面...
4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...
Java泛型是Java SE 5.0引入的一个重要特性,极大地提高了代码的类型安全性和重用性。在本文中,我们将深入探讨Java泛型的进阶概念,包括通配符、边界、类型擦除以及在实际开发中的应用。 1. 通配符 通配符在Java...
在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率,因为编译器可以在编译时检查类型,避免了运行时...