`
不平凡的人
  • 浏览: 35702 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

泛型(二)

 
阅读更多

本文主要介绍一下泛型的上限,下限以及通配符?的使用事项:

代码示例如下:

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框架和泛型来实现二级联动的效果。 WebWork是一个Java Web应用程序框架,它提供了模型-视图-控制器(MVC)架构,简化了Java Web应用的开发。WebWork以其强大的动作映射、...

    java泛型指南 经典

    #### 二、Java 泛型概述 Java 泛型是一种允许编译器检查类型安全性的功能,并允许创建高度可重用的类和接口。通过使用泛型,开发者可以在运行时避免强制类型转换,并且能够编写更易于理解、维护和扩展的代码。 ###...

    java 1.5泛型详解

    **二、泛型的优点** 1. **类型安全**:泛型确保了在编译时就能检测到可能的类型错误,避免了运行时因类型不匹配而引发的异常。 2. **强制类型转换的消除**:泛型可以自动进行类型转换,无需程序员手动转换,减少了...

    C#泛型集合与非泛型集合

    #### 二、非泛型集合简介 非泛型集合主要位于 `System.Collections` 命名空间中,包括但不限于 `ArrayList`, `Hashtable`, `Queue`, `SortedList`, `Stack` 等。这些集合在设计之初并未考虑到类型安全性的问题,...

    泛型和泛型集合类用法

    #### 二、泛型集合类简介 .NET Framework 2.0引入了一系列泛型集合类,这些集合类位于`System.Collections.Generic`命名空间中。与非泛型集合相比,泛型集合提供了更强的类型安全性,减少了运行时的装箱与拆箱操作...

    Java泛型的用法及T.class的获取过程解析

    二、泛型的四点作用 1. 泛化:泛型可以拿个T代表任意类型,提高代码的灵活性和可读性。 2. 泛型 + 反射:泛型可以与反射结合使用,通过反射的API来获取T的Class。 3. 收敛:泛型可以增加类型安全,减少了强制类型...

    C__泛型的运用

    #### 二、泛型的重要性 1. **类型安全性**:泛型提供了静态类型检查的能力,确保在编译时类型的安全性。 2. **代码重用**:通过泛型,可以编写一次性的代码来处理不同的数据类型,从而减少了代码重复。 3. **性能...

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    C_泛型集合

    此外,`BinarySearch`方法可以高效地进行二分查找,前提是集合已经排序。 总结,C#的泛型集合通过提供强类型、类型安全以及灵活性,极大地优化了数据集合的管理和操作,减少了开发工作量,并提升了代码的可读性和...

    泛型工具类

    第一个版本仅接受一个类对象作为参数,第二个版本额外接受一个整型索引,用于指定要获取的泛型参数的位置。 - **方法逻辑分析**: - 首先,方法尝试通过`getGenericSuperclass()`获取当前类的泛型超类。如果当前类...

    WCF中应用泛型

    #### 二、目标:WCF服务中的泛型应用 本章节的目标是在WCF服务契约的操作契约中应用泛型,以实现类似于下面的效果: ```csharp [OperationContract] TMethodName(int dataType) where T : EntityBase; ``` 或者 ...

    java泛型技术之发展

    二、核心概念 1. 泛型类:可以带有类型参数的类,例如`ArrayList&lt;T&gt;`,这里的T就是类型参数,代表一种未知类型。 2. 泛型接口:接口也可以有类型参数,如`Comparator&lt;T&gt;`,用于比较两个对象。 3. 泛型方法:在...

    C#泛型接口实例

    二、泛型接口的约束 有时,我们需要对类型参数施加一些限制,如必须实现特定接口、必须是引用类型或值类型等。这可以通过接口中的约束条件实现。例如: ```csharp public interface IMyGenericInterface&lt;T&gt; where ...

    java 泛型方法使用示例

    **二、泛型方法语法** 泛型方法的声明通常包含以下部分: 1. 访问修饰符(如 public, private 等) 2. 返回类型 3. 类型参数列表(用尖括号 `和 `&gt;` 包裹) 4. 方法名 5. 参数列表 例如,一个接受两个相同类型...

    传智播客Java教程 Java基础答疑公开课(一)

    在"泛型二.avi"中,可能进一步探讨的内容有: 1. 泛型的边界:如何定义有界的类型参数,如`class Box&lt;T extends Comparable&lt;T&gt;&gt;`,确保存储的类型可以进行比较。 2. 泛型和集合:泛型在ArrayList、LinkedList等...

    细细品味C#(泛型专题)

    #### 二、C# 泛型的优点 - **2.2.1 泛型介绍** - **基本概念**:泛型允许开发者编写类型安全的通用代码,这些代码可以用于多种具体类型。通过使用泛型,可以避免代码重复,并提高代码的复用性和维护性。 - **...

Global site tag (gtag.js) - Google Analytics