Java重要技术(23)泛型之问号通配符

1.1. 问号通配符

在类型参数中使用问号通配符,可以有三种不同的用法:

(1)Generic<?> 表示类型参数为任意对象类型。

(2)Generic<? extends B>表示类型参数为B或者B的派生类。

(3)Generic<? super B>表示类型参数为B或者B的父类。

static class  A {}

static class  B extends A{}

static class  C extends B{}

static class Generic<T> { }

    static class Holder{

     //Generic<?>可以接受类型参数不同的各种参数化类型。

     public void work( Generic<?> obj ){  }

     //? extends B表示类型参数可以是B,或者B的派生类。

     public void workForBC( Generic<? extends B> obj){

     }

     //? super B表示类型参数可以是B,或者B的父类。

     public void workForAB( Generic<? super B> obj){

     }

    }

public static void main(String[] args) {

Holder holder = new Holder();

//work(Generic<A> obj);

holder.work(new Generic<A>());

//work(Generic<B> obj);

holder.work(new Generic<B>());

//work(Generic<C> obj);

holder.work(new Generic<C>());

holder.workForBC(new Generic<B>());

holder.workForBC(new Generic<C>());

//错误,A是B的父类。

//holder.workForBC(new Generic<A>());

holder.workForAB(new Generic<A>());

holder.workForAB(new Generic<B>());

//错误,C是B的派生类。

//holder.workForAB(new Generic<C>());

}

}
时间: 2024-08-04 12:10:11

Java重要技术(23)泛型之问号通配符的相关文章

Java重要技术(19)泛型之泛型的使用方法

1.1. 泛型的用法 参数化类型比如Sample<T>中的类型参数T可以用于构造函数的参数的类型,方法的返回值的类型,画着方法的参数的类型,属性字段的类型等. public class GenericParameterTest { //参数化类型T,可以为String,Integer等引用类型. static class Sample<T> { public Sample(T obj){ this.obj = obj; } //参数化类型作为返回值的类型. public T wor

Java重要技术(22)泛型之参数化类型的本质

1.1. 参数化类型的本质 Java参数化类型相对于C++的参数化类型而言,有本质区别.前者只是编译器的类型检查的一种手段,而后者则是真正的不利于原始类型的新的类型. public class GenericParameterTest3 { static class Hello{} static class World{} static class Generic<T>{} public static void main(String[] args) { //三者编译后的类型完全相同. Gen

Java重要技术(24)泛型之使用反射访问参数化类型

1.1. 用反射访问参数化类型 使用反射机制可以获取到一部分参数化类型有关的信息. public class GenericParameterTest5 { static class Base{} static class Generic<T extends Base>{ public T work( List<T> list){ return list.get(0); } public T work( T obj){ return obj; } } public static v

Java重要技术(20)泛型之参数化类型的特点

1.1. 参数化类型的特点 参数化类型有以下特点: (1)参数化类型和没有类型参数的原始类型在编译后没有本质区别. (2)类型参数不同的两个参数化类型,不能混用. public class GenericParameterTest { //参数化类型T,可以为String,Integer等引用类型. static class Sample<T> { //不带参数的构造函数. public Sample(){ this.obj = null; } public Sample(T obj){ th

Java重要技术(21)泛型之参数化类型的特点(续)

1.1. 参数化类型的特点2 类型参数不同但是存在继承关系的两个参数化类型,仍然不能混用.类型参数的继承关系不能推导出参数化类型具有继承关系. public class GenericParameterTest2 { static class Base {} static class Derived extends Base {} static class Generic<T>{} /** * @param args */ public static void main(String[] ar

JAVA 泛型中的通配符 T,E,K,V,?

前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 泛型带来的好处 在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的.对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这

java泛型之使用通配符参数

类型安全虽然有用,但是有时可能会影响代码结构,使得无法被完全接受.例如,对于上一节的Stats类,假设希望添加方法sameAvg(),该方法用于判定两个Stats对象包含的数组的平均值是否相同,而不考虑每个对象包含的数值数据的具体类型.例如,如果一个对象包含double值1.0.2.0.和3.0,另一个对象包含整数值2.1和3,那么平均值是相同的.实现sameAvg()方法的一种方式是传递Stats参数,然后根据调用对象比较参数的平均值,只有当平均值相同时才返回true.例如: ...... I

【转】聊一聊-JAVA 泛型中的通配符 T,E,K,V,?

原文:https://juejin.im/post/5d5789d26fb9a06ad0056bd9 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 泛型带来的好处 在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类

Java基础笔记:泛型

内容:Java中的泛型 优秀文章:新浪博客-海洋星球:http://blog.sina.com.cn/s/blog_44c1e6da0100cus3.html书籍:细说Java.疯狂Java讲义 说明:泛型是于Java SE1.5添加的新特性:泛型的本质是参数化类型,简单来说就是将泛型看作一个或多个参数,使用这个参数的代码片段可以由任何具体类类型的参数来替换:泛型的参数类型只能是类类型,不能是简单类型(简单类型是指不能再简化的编程语言内置数据类型,java中有实数-float-double.整数