本文主要介绍一下泛型的上限,下限以及通配符?的使用事项:
代码示例如下:
package net.oschina.tkj.chapter15.limit; /** * 泛型上下限,?通配符 * * @author Freedom * * @param <T> */ public class BasicInfo<T> { private T var; public T getVar() { return var; } public void setVar(T var) { this.var = var; } public void f(T t) { System.out.println("任意类型对象:" + t); } public void f1(BasicInfo<?> t) { System.out.println("通配符类型对象:" + t); } public void f2(BasicInfo<Object> t) { System.out.println("Object类型的泛型对象接受参数:" + t); } @Override public String toString() { return "BasicInfo [var=" + var + "]"; } // 泛型的上限 public void f3(BasicInfo<? extends T> t/* ,T t1 */) { // 泛型的上限也可以接受T类型或T的子类型,但是不能为对象设置值 // t.setVar(t1); System.out.println("泛型上限:" + t); } // 泛型下限 public void f4(BasicInfo<? super T> t) { System.out.println("泛型下限:" + t); } // 泛型下限 public void f5(BasicInfo<? super T> t, T t1) { // 泛型的下限可以为泛型对象设置值 t.setVar(t1); System.out.println("泛型下限:" + t); } public static void main(String[] args) { BasicInfo<String> str = new BasicInfo<String>(); str.setVar("hello<T>"); // str.f(str); // 编译错误,对象确定之后参数化类型已经确定,例子中为String类型的入参 str.f("abc");// 正确 str.f1(str); // str.f2(str);// 该方法的入参只能为Object类型的泛型对象,所以例子中的为String类型的泛型对象 BasicInfo<?> basic = new BasicInfo<String>(); // basic.setVar("abc"); // ?通配符可以接受任意类型的泛型对象,但是不能设置泛型对象的值 // 明确声明了变量为Object类型的泛型对象,因此实例化String类型的泛型对象会报错 // BasicInfo<Object> basic2 = new BasicInfo<String>(); BasicInfo<String> str1 = new BasicInfo<String>(); str1.setVar("《? extends T》"); // 调用f3方法时已经明确T为String,所以只能接受String类型,因为String为final类无子类型 str.f3(str1); BasicInfo<String> str2 = new BasicInfo<String>(); str2.setVar("《? super T》"); str.f4(str2); str.f5(new BasicInfo<String>(), "f5()"); } }
1、泛型类声明了参数化类型,所以当创建该泛型类型的对象时就可以确定T的类型;
2、如上代码示例,如果试图尝试在方法入参时声明参数类型为BasicInfo<Object>,但是传参的时候传入了BasicInfo<String>编译会报错,所以入参只能传入BasicInfo<Object>类型的参数;
3、可以声明一个带有通配符的参数对象,BasicInfo<?>这样就可以接受一个BasicInfo<String>类型的对象。该中参数类型声明方式也有一个弊端,就是实例化的对象不能去设置对象的值;
4、泛型的上限:<? extends T >可以接受T类型,以及T的子类型。同样,也不能在实例化的对象中设置值;
5、泛型下限:<? super T>可以接受T类型,以及T的父类型。实例化对象时,可以为对象设置值。
6、?,<? extends T> 用于接受或者说是取出T类型的元素;<? super T>用于添加设置T类或T的子类的值
相关推荐
在这个场景中,我们将讨论如何结合WebWork框架和泛型来实现二级联动的效果。 WebWork是一个Java Web应用程序框架,它提供了模型-视图-控制器(MVC)架构,简化了Java Web应用的开发。WebWork以其强大的动作映射、...
#### 二、Java 泛型概述 Java 泛型是一种允许编译器检查类型安全性的功能,并允许创建高度可重用的类和接口。通过使用泛型,开发者可以在运行时避免强制类型转换,并且能够编写更易于理解、维护和扩展的代码。 ###...
**二、泛型的优点** 1. **类型安全**:泛型确保了在编译时就能检测到可能的类型错误,避免了运行时因类型不匹配而引发的异常。 2. **强制类型转换的消除**:泛型可以自动进行类型转换,无需程序员手动转换,减少了...
#### 二、非泛型集合简介 非泛型集合主要位于 `System.Collections` 命名空间中,包括但不限于 `ArrayList`, `Hashtable`, `Queue`, `SortedList`, `Stack` 等。这些集合在设计之初并未考虑到类型安全性的问题,...
#### 二、泛型集合类简介 .NET Framework 2.0引入了一系列泛型集合类,这些集合类位于`System.Collections.Generic`命名空间中。与非泛型集合相比,泛型集合提供了更强的类型安全性,减少了运行时的装箱与拆箱操作...
二、泛型的四点作用 1. 泛化:泛型可以拿个T代表任意类型,提高代码的灵活性和可读性。 2. 泛型 + 反射:泛型可以与反射结合使用,通过反射的API来获取T的Class。 3. 收敛:泛型可以增加类型安全,减少了强制类型...
#### 二、泛型的重要性 1. **类型安全性**:泛型提供了静态类型检查的能力,确保在编译时类型的安全性。 2. **代码重用**:通过泛型,可以编写一次性的代码来处理不同的数据类型,从而减少了代码重复。 3. **性能...
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
此外,`BinarySearch`方法可以高效地进行二分查找,前提是集合已经排序。 总结,C#的泛型集合通过提供强类型、类型安全以及灵活性,极大地优化了数据集合的管理和操作,减少了开发工作量,并提升了代码的可读性和...
第一个版本仅接受一个类对象作为参数,第二个版本额外接受一个整型索引,用于指定要获取的泛型参数的位置。 - **方法逻辑分析**: - 首先,方法尝试通过`getGenericSuperclass()`获取当前类的泛型超类。如果当前类...
#### 二、目标:WCF服务中的泛型应用 本章节的目标是在WCF服务契约的操作契约中应用泛型,以实现类似于下面的效果: ```csharp [OperationContract] TMethodName(int dataType) where T : EntityBase; ``` 或者 ...
二、核心概念 1. 泛型类:可以带有类型参数的类,例如`ArrayList<T>`,这里的T就是类型参数,代表一种未知类型。 2. 泛型接口:接口也可以有类型参数,如`Comparator<T>`,用于比较两个对象。 3. 泛型方法:在...
二、泛型接口的约束 有时,我们需要对类型参数施加一些限制,如必须实现特定接口、必须是引用类型或值类型等。这可以通过接口中的约束条件实现。例如: ```csharp public interface IMyGenericInterface<T> where ...
**二、泛型方法语法** 泛型方法的声明通常包含以下部分: 1. 访问修饰符(如 public, private 等) 2. 返回类型 3. 类型参数列表(用尖括号 `和 `>` 包裹) 4. 方法名 5. 参数列表 例如,一个接受两个相同类型...
在"泛型二.avi"中,可能进一步探讨的内容有: 1. 泛型的边界:如何定义有界的类型参数,如`class Box<T extends Comparable<T>>`,确保存储的类型可以进行比较。 2. 泛型和集合:泛型在ArrayList、LinkedList等...
#### 二、C# 泛型的优点 - **2.2.1 泛型介绍** - **基本概念**:泛型允许开发者编写类型安全的通用代码,这些代码可以用于多种具体类型。通过使用泛型,可以避免代码重复,并提高代码的复用性和维护性。 - **...