两个概念:
<T> T类型形参
<String> String是实际类型参数
并不存在泛型类
我们所说的泛型类是逻辑上的,物理上是不存在,
List<String> a = new ArrayList <String>();
List<Integer> b = new ArrayList <Integer>();
System.out.print(a.getClass() == b.getClass());//打印的结果是 "true"
List<Integer> b = new ArrayList <Integer>();
System.out.print(a.getClass() == b.getClass());//打印的结果是 "true"
因为List<String> 和 List<Integer>是同种类,他们在内存中是占用同一块内存,
所有静态域,静态方法,静态初始化块,是不允许使用泛型的。
static T info;
public static T getCount(){}
//以上两个都是错误的,静态XX是不允许使用泛型,因为他们是使用一块内存的,作为类变量和类方法是共享的,所以不能因T的改变而改变,故使用泛型编程是不合法的。
public static T getCount(){}
//以上两个都是错误的,静态XX是不允许使用泛型,因为他们是使用一块内存的,作为类变量和类方法是共享的,所以不能因T的改变而改变,故使用泛型编程是不合法的。
从泛型类派生子类
不能带类型形参。只能带实际类型参数。注意:String 是 Object的子类。但是 List<String> 不是 List<Object>的子类。
数组和泛型
数组的父类只能是数组或者Object有类 A BB extends AB[] 不是 A或者B的子类B[] 是A[]的子类 也是Object的子类G<A> 和G<B>G<B> 不是G<A> 的子类,这是泛型在继承上与数组的不同之处
类型通配符 "?"
利用类型通配符目的是来表示泛型的父类
例如: List<?> 是List<T>(T是任何类型) 的父类。 "?"是可以匹配任何类型的。
List<?> 只是用来表示父类,List<?> a a.add(new Object()); 这个是不合法的,因为根本就不知道a 里面是什么类型,所以不能进行add操作。
设定通配符的上限 List<? extends shaps>
List<? extends shaps> 缩小了? 的范围 只能是shaps本身,或者是shaps的派生子类。
public void do (List<?> shaps){
Shaps myShaps =(Shaps) shaps.get(0);//要进行类型转换,比较繁琐
myShaps.paint();//调用shaps的一个方法;
}
public void do (List<? extends Shaps> shaps){
shaps.get(0).paint();//不用进行强制类型转换,利用多态,shaps 是Shaps 或者Shaps子类实例,都可以不用强制类型转换就可以调用paint()方法。
}
Shaps myShaps =(Shaps) shaps.get(0);//要进行类型转换,比较繁琐
myShaps.paint();//调用shaps的一个方法;
}
public void do (List<? extends Shaps> shaps){
shaps.get(0).paint();//不用进行强制类型转换,利用多态,shaps 是Shaps 或者Shaps子类实例,都可以不用强制类型转换就可以调用paint()方法。
}
注意:同 "?"一样 "List<? extends a> " a.add(new Shaps()); 也是不合法的,因为不能准确知道子类类型。
总之:使用 通配符"?" 类型就是未知,所以不能add进去
设定类型形参的上限 List<T extends shaps>
List<T extends shaps & java.io.serializable>
还可以这样子,用&实现多个限制,
相关推荐
在C#编程中,泛型列表`List<T>`是一个非常重要的数据结构,它为我们提供了动态数组的功能,并且具有类型安全的特性。这篇文章将深入探讨`List<T>`的使用,包括其基本操作、性能特点以及一些高级用法。 一、基础概念...
在C#中,`List<T>`是一个非常常用的泛型集合类,它提供了动态数组的功能,可以存储任意数量的相同类型元素。当涉及到对List中的数据进行排序时,我们可以采用多种不同的策略和技术。本篇文章将详细介绍`List<T>`的...
然而,Java的泛型默认是不变的(Invariance),即`List<B>`并不是`List<A>`的子类,因为这样可能导致不安全的操作。为了实现协变,可以使用`? extends`语法;逆变(Contravariance)则在函数参数中使用`? super`实现...
- `<name>`、`<expression>`等用尖括号`<>`包围的词汇表示变量名、表达式等,用于泛指某些内容。 - 示例:`<name>=<expression>`可以表示`x=5`或`name="John"+"Stewman"`。 2. **语句**: - `<statement>`可以是...
2. **版本兼容性**:不同类型的泛型实例之间是不兼容的,这意味着`Gen<Integer>`和`Gen<String>`是两个不同的类。 3. **多参数类型**:一个泛型可以有多个类型参数,如`<T, U>`。 4. **有界类型**:使用`extends`...
在这个"泛型集合项目练习"中,我们将深入探讨如何利用泛型集合,特别是`Dictionary<TKey, TValue>`和`List<T>`,来实现数据的组织和管理,并通过写入器来输出数据。 首先,我们来看**泛型集合的概念**。泛型集合...
2006/01/01 <br><br>本书描述了C++编程和设计中必须掌握但通常被误解的主题,这些主题涉及的范围较广,包括指针操作、模板、泛型编程、异常处理、内存分配、设计模式等。作者根据本人以及其他有经验的管理人员和...
2006/01/01 <br><br>本书描述了C++编程和设计中必须掌握但通常被误解的主题,这些主题涉及的范围较广,包括指针操作、模板、泛型编程、异常处理、内存分配、设计模式等。作者根据本人以及其他有经验的管理人员和...
在定义泛型类或方法时,这些类型参数被放在类名或方法签名之后的一对尖括号`<>`内。 例如,在`java.util.List`接口中,类型参数`E`被用来表示列表中元素的类型: ```java public interface List<E> { void add(E x...
### 泛型基础知识与应用详解 #### 泛型概述 泛型是Java语言的一个重要特性,它主要解决了在集合框架中频繁出现的类型转换问题,同时也增强了类型安全性。泛型的概念最早出现在Java 5.0版本中,它允许开发者创建能够...
本篇文章主要探讨如何在C#中通过使用`DataSet`对象来读取数据库,并将其转换为泛型集合,如`List<T>`。 首先,我们来看一个基本的示例代码,它演示了如何从数据库获取数据并将其绑定到一个`GridView`控件上。`Page_...
- **原因解释**:如果允许 `List<Integer>` 赋值给 `List<Number>`,则可能会导致类型安全问题,例如将非 Integer 类型的数据添加到 `List<Integer>` 中,从而破坏了泛型设计的初衷。 #### 四、其他协变问题 - **...
+ 技术点: 使用泛型链表LinkedList<VIPReader>保存读者对象、用列表框JList显示读者信息、列表框放在带滚动条的滚动面板中、用泛型向量Vector<VIPReader>作为列表框的数据源等技术。 总结 本资源涵盖了Java语言的...
<groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> ...
在C#编程语言中,向量的加减操作是计算机图形学、物理学和...总结来说,这个示例展示了C#中如何利用泛型、可空类型和运算符重载来实现向量的加减运算。这不仅提高了代码的复用性,也使得处理数学运算更加直观和便捷。
总结一下,通过使用`IComparable<T>`接口和`Comparer<T>`类,我们可以解决泛型排序的问题。对于通用的“+”操作,我们可以利用表达式树来实现动态的类型检查和代码生成。这些都是.NET框架中泛型编程的重要技术,有助...
extends Fruit>`可以视为`Plate<Fruit>`及`Plate<Apple>`等所有`Fruit`的子类的容器的共同基类。这样就可以将`Plate<Apple>`实例赋值给`Plate<? extends Fruit>`类型的变量: ```java Plate<? extends Fruit> p = ...