3.泛型类型范围限定

泛型提供通用方法

/**
* clazz对象创建一个新的实例对象并返回
*
* @param clazz class对象
* @return
* @throws IllegalAccessException
*/
public static <T> T test(Class<T> clazz) throws InstantiationException, IllegalAccessException {
    System.out.println(clazz.getName());
    return clazz.newInstance();
}

指定泛型类型的范围,使用extends或super

extends: 继承限定T的范围上限
super: 限定T范围下限
<T extends User3>限定T要继承User3类或实现User3接口
<T super User3 >限定TUser3的超类
<T extends UserTest1 & User5>限定T要继承UserTest1类或实现UserTest1接口,并且要实现User5接口

<T extends User3>的方法
限制效果:T必须继承User3,否则在运行时会报类型转化异常

extends继承demo

@Data
class UserTest1 {
}
/**
* 规定泛型T的范围是继承User3
*
* @param list TODO
* @return
* @throws
*/
public static <T extends User3> void test5(List<T> list) {
    for (T t : list) {
        System.out.println(t);
    }
}
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
    List objects1 = Lists.newArrayList();
    UserTest1 userTest1 = new UserTest1();
    objects1.add(userTest1);
    GenericTopic.test5(objects1);
}

test5泛型方法,并指定泛型的范围是继承User3,但是UserTest1并没有继承User3,在遍历list时,就会报类型转化异常。如下异常

Exception in thread "main" java.lang.ClassCastException: com.enterprise.article.base.generic.UserTest1 cannot be cast to com.enterprise.article.base.generic.User3
	at com.enterprise.article.base.generic.GenericTopic.test5(GenericTopic.java:70)
	at com.enterprise.article.base.generic.UseGeneric.main(GenericTopic.java:164)

泛型多继承

<T extends UserTest1 & User5>的用法

限制效果:

  1. T必须继承UserTest1,否则在运行时会报类型转化异常
  2. 在执行User5接口中存在的方法时,T必须实现User5定义的该方法,否则在运行时会报类型转化异常
/**
* 规定泛型T的范围是继承User3并实现User4
*
* @param list TODO
* @return
* @throws
*/
public static <T extends UserTest1 & User5> T test6(List<T> list) {
    for (T t : list) {
        t.user5Method();
        t.user1Method();
    }
    return list.get(0);
}
@Data
class UserTest1 {
}
interface User5 {
    Long user5Id = 123L;
    Long userId = null;

    void user5Method();
}
@Data
class UserTest2 extends UserTest1 {
    public void user5Method() {
        System.out.println("UserTest2 a方法");
    }
}

Test:

public static void main(String[] args) throws InstantiationException, IllegalAccessException {
    List objects1 = Lists.newArrayList();
    UserTest2 userTest2 = new UserTest2();
    objects1.add(userTest2);
    GenericTopic.test6(objects1);
}

在UserTest2不实现User5接口的情况下,执行t.user5Method()会报如下异常。

Exception in thread "main" java.lang.ClassCastException: com.enterprise.article.base.generic.UserTest2 cannot be cast to com.enterprise.article.base.generic.User5

原因是在执行User5接口中存在的方法时,如user5Method方法,T类必须实现并覆盖User5的该方法。才能执行该方法。

以下场景能够运行成功:

  1. 该方法没有在User5接口中定义,并且该方法是UserTest1的方法。
  2. 不执行User5中的方法,相当于,去除了实现User5的限制
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2.ASP.NET.2.0.高级编程(第4版) [1/7] 原书名: Professional ASP.NET 2.0 原出版社: Wrox 作者:(美)Bill Evjen, Scott Hanselman, Farhan Muhammad [同作者作品] [作译者介绍] 译者: 李敏波[同译者作品] 出版社:清华大学出版社 ISBN:7302139067 上架时间:2006-11-16 出版日期:2006 年11月 开本:185×260 页码:1090 版次:4-1 内容简介回到顶部↑本书全面介绍了ASP.NET各种编程技能和2.0版中的巨大变化,并详细阐述了2.0版中的每个新特性。书中提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP.NET初级程序员以及准备迁移到ASP.NET 2.0的编程老手。该书与《ASP.NET 2.0入门经典(第4版)》及其早期版本,曾影响到无数中国Web程序员。. ASP.NET允许Web站点为每个访问者显示独一无二的页面,而不是显示相同的静态HTML页面。ASP.NET 2.0的发布,使Web应用程序的开发又前进了一大步。这个新版本增加了大量的新功能,减少了编写常见应用程序所需的代码量。 ASP.NET 2.0新增了50多个新服务器控件,类的数量也翻了一倍,其他许多方面也有很大的变化。本书介绍了ASP.NET 2.0中的每个新增特性和功能,以便读者把这些新技术应用于实践。.. 本书主要内容 ● 服务器控件的概念及其在ASP.NET开发中的主导作用 ● 使用新的Master页面特性创建模板化的ASP.NET页面 ● 调试和处理错误的技术 ● 提取、创建、处理和存储XML的各种框架 ● 打包和部署ASP.NET应用程序的方法 ● 快速、逻辑地检索、更新和删除数据 本书读者对象 本书适合于有一些ASP.NET基础知识的学习者以及准备迁移到ASP.NET 2.0的有经验的程序员和开发人员。 目录回到顶部↑ 第1章 ASP.NET 2.0概述 1 1.1 简史 1 1.2 ASP.NET 2.0的目标 2 1.2.1 开发人员的效率 3 1.2.2 管理 5 1.2.3 性能和可伸缩性 8 1.3 ASP.NET 2.0的其他新特性 8 1.3.1 新的开发人员体系结构 8 1.3.2 新的编译系统 12 1.3.3 页面框架的新增内容 13 1.3.4 访问数据的新对象 15 1.3.5 新的服务器控件 15 1.4 建立ASP.NET 2.0页面的新IDE 16 1.5 小结 17 第2章 Visual Studio 2005 19 2.1 启动页面 19 2.2 文档窗口 20 2.2.1 文档窗口中的视图 20 2.2.2 标记导航器 21 .2.2.3 页面标签 22 2.2.4 代码改变状态的通知 23 2.2.5 错误通知和辅助 23 2.3 工具箱 25 2.4 Solution Explorer 26 2.5 Server Explorer 28 2.6 Properties窗口 28 2.7 丢失的窗口 29 2.8 其他常见的Visual Studio操作 29 2.8.1 创建新项目 29 2.8.2 引用其他对象 30 2.8.3 使用智能标记 32 2.8.4 保存和导入Visual Studio设置 32 2.8.5 验证HTML 34 2.8.6 团队的合作 36 2.8.7 使用代码片断 36 2.9 小结 38 第3章 应用程序和页面框架 39 3.1 应用程序的位置选项 39 3.1.1 内置的Web服务器 39 3.1.2 IIS 40 3.1.3 FTP 41 3.1.4 Web站点需要FrontPage Extensions 42 3.2 ASP.NET页面结构选项 43 3.2.1 内置编码 44 3.2.2 新的后台编码模 46 3.3 ASP.NET 2.0的Page指令 48 3.3.1 @Page 49 3.3.2 @Master 51 3.3.3 @Control 52 3.3.4 @Import 53 3.3.5 @Implements 54 3.3.6 @Register 55 3.3.7 @Assembly 55 3.3.8 @PreviousPageType 56 3.3.9 @MasterType 56 3.3.10 @OutputCache 56 3.3.11 @Reference 57 3.4 ASP.NET页面的事件
### 回答1: 中的限定通配符是指在类型中使用了extends或super关键字来限制类型范围,使其只能接受某个特定类型或其子类型或父类型作为参数。例如:List<? extends Number>表示只能接受Number及其子类作为参数。 非限定通配符是指在类型中使用了通配符“?”来表示可以接受任何类型作为参数,但是在使用时无法获取类型的具体信息。例如:List<?>表示可以接受任何类型的List作为参数,但是无法获取其中元素的具体类型信息。 ### 回答2: 是Java语言中一种非常强大的特性,它能够使Java代码更加通用和安全。 在中,通配符是一种非常重要的语法,它能够限制类型范围,从而使Java程序更加类型安全。通配符分为限定通配符和非限定通配符两种类型。 首先,非限定通配符就是指没有任何限制的通配符,使用“?”符号来表示。在Java中,我们可以将一个对象赋值给一个非限定通配符对象,这样就可以保证代码的通用性。 举个例子,假设我们有一个ArrayList集合,集合中存储的是Animal类的对象。我们可以将这个ArrayList赋值给一个非限定通配符的对象,这样就可以将集合中的元素通用化,可以同时适用于Cat类和Dog类。 但是,如果我们想要对通配符进行类型限制,就需要使用限定通配符了。 限定通配符可以通过使用extends或者super关键字来实现。其中,extends用于限制类型的上界,super用于限制类型的下界。 需要注意的是,extends和super关键字只能使用在通配符中,而不能直接用在中。 举个例子,假如我们有一个Animal类,以及它的两个子类Cat和Dog。我们现在想要一个可以存储Animal及其子类对象的集合,但是不想让集合存储Bird及其子类对象。这个时候,我们就可以使用限定通配符来约束集合元素的类型范围。例如: ArrayList<? extends Animal> animals = new ArrayList<Cat>(); //这是合法的 ArrayList<? extends Animal> animals2 = new ArrayList<Bird>(); //这是不合法的 这样就能够保证animals集合只存储Animal及其子类对象,而不会存储Bird及其子类对象。 总之,限定通配符和非限定通配符是中的两个重要概念。通过使用这些通配符,我们可以限制类型范围,使Java程序更加类型安全。 ### 回答3: 中的通配符指的是在定义类或方法时使用的一种特殊符号,它可以替代任何类型的实参,从而实现更加灵活的代码编写。 其中,有两种常见的通配符,分别是限定通配符和非限定通配符。 非限定通配符用“?”表示,它可以匹配任何类型的实参。例如,定义一个方法时可以使用“?”作为参数类型,这样就能够在方法中处理任何类型的数据。 限定通配符则使用类型来表示,它可以限制通配符只能匹配某些具体的类型或其子类型。例如,定义方法时可以使用“? extends Number”来限定参数类型范围,这样方法只接受Number及其子类类型的实参。 在使用通配符时,需要注意通配符只能作为参数、返回值或类型变量的上界使用,不能用作实例化类型类型参数的下界。此外,通配符不能使用任何操作符,而只能使用Object类提供的通用方法。 综上所述,中的限定通配符和非限定通配符是为了提高程序的灵活性和适用性而设计的。通过选择适当的通配符来限制参数类型范围,可以有效避免类型转换异常和其他类型相关的问题,使代码更加健壮和可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gzh-程序员灿灿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值