黑马程序员-day15-泛型

本文详细介绍了Java泛型的概念、优点、定义方法、自定义泛型类、泛型方法、子父类泛型、泛型接口、集合泛型限定、上限定与下限定等内容,并强调了集合泛型限定的重要性。

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

泛型概述1.5以后新特性,用于解决安全问题(集合类存放的不是同一类的元素),是一个类型安全机制
优点将运行异常转移到了编译异常;避免强制转换
格式<元素类型>,1.7后在定义泛型集合时,后面的尖括号里面的内容可省略
定义泛型所有与集合类、接口相关的均具备泛型属性,注意equals方法是Object类的,不具备泛型
自定义泛型类当类中要使用的应用数据类型不确定的时候,定义泛型类,由使用者指定类型;java早期是定义Object,并通过强转来完成扩展,存在安全隐患,现在使用泛型
注意静态方法不能访问泛型类的参数,可在静态方法的主体自定义泛型
泛型方法在返回值类型前加上泛型,如<T>即可,用于声明一个参数类型与泛型类的泛型不一致的方法
如果参数类型中的泛型已被指定,则方法体无需加泛型,如果参数类型中的泛型没有明确,则方法体必须加上泛型
子父类泛型当父类没有加泛型时,子类可以加任意泛型
当父类加了泛型未指定泛型类型时,子类也必须加上该泛型且不可指定泛型类型,但可以扩展其他任意泛型类型
当父类加了泛型且明确泛型类型时,子类默认有该泛型,可加可不加
泛型接口在实现泛型接口时,既可以明确类的泛型元素类型,也可以不明确,建议明确
集合泛型限定当不明确参数类型时,可以用<?>占位符来表示此处具备一个给定类的某参数类型,不用将方法定义为泛型方法,好处是扩展性强,坏处是无法使用元素的特有方法,只能使用共同方法(大部分是Object类的方法)
<?>没有实际意义,代表任意类型,可以使用在静态方法的参数类型中
<>限定的集合可以对其子类元素进行操作:假设A是B的子类,那么ArrayList<B>也可以存储A的实例对象。
但注意当集合作为参数传递时,如一个方法的参数类型为(ArrayList<A> al),那么不管A和B是什么关系,如果传递(ArrayList<B> al)实例是肯定报错的,也就是说<>中的内容不一样的话,会出现安全隐患报错。
固定限定<类名>
上限定与下限定<? Extends A>,A以及A的所有子类
<? super A>,A以及A的所有父类
注意一定要记住,集合泛型限定,但是方法的参数仍然是集合,不是限定里的类类型
### C# 概述 C# 提供了一种机制,在定义方法、类、接口时不涉及具体的类,而是在使用时再指定实际的数据类。这不仅提高了代码的灵活性和重用性,还增强了类安全性并优化了性能[^1]。 #### 的优势 利用技术能够实现最大化的代码复用度、保持类安全性和提升执行效率。借助于.NET框架提供的`System.Collections.Generic`命名空间下的多个内置集合类,开发者可以直接采用这些高效且类安全的数据结构来代替旧版非版本[^2]。 #### 创建自定义组件 除了使用现成的集合外,还可以构建属于自己的接口、类、方法等。下面是一个简单的栈(Stack)实现例子: ```csharp class MyStack<T> { private List<T> items; public MyStack() { items = new List<T>(); } public void Push(T item) { items.Add(item); } } ``` 此段代码展示了如何声明一个带有单个类参数`<T>`的类,并在其内部操作该类的实例。这里选择了更灵活的`List<T>`作为存储容器而不是数组,以便更好地管理动态增长的需求[^4]。 #### 类约束的应用 为了使更加实用,有时需要对允许传入的具体类加以限制。例如,当希望某个函数仅能接收实现了特定接口的对象时,则可以通过添加where子句来进行限定: ```csharp public class ExampleClass<T> where T : IComparable, IDisposable { // Class implementation... } ``` 上述语法表示只有那些既继承了IDisposable又实现了IComparable接口的类才可以被当作`ExampleClass<>`的实际参数传递给定界符内的位置。 #### 委托简介 另外值得一提的是委托——一种结合了特性的委托形式。它们允许我们像对待常规方法那样处理具有不同签名的动作或行为模式。比如定义如下所示的一个简单事件处理器模板: ```csharp public delegate TResult Func<in T, out TResult>(T arg); // 或者用于无返回值的情况 public delegate void Action<in T>(T obj); ``` 这里的关键词`in` 和 `out`分别指定了输入/输出方向上的协变特性支持[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值