篇一 :java泛型总结

泛型总结篇:

1)泛型参数只能是类类型

例如:List<int> // 报错

List<Integer> // 正确

2)泛型的类型参数可以有多个!

例如:List<Integer,String,Boolean> list = new

ArrayList<Integer,String,Boolean>();

3)泛型的参数类型可以使用extends,习惯称“有界类型”,

例如:List<student extends person>,person为list的上界

4)泛型可以使用通配符类型!“?” 相当于“Object”类型,(注意不可逆) 例如:List<?> //定义成这样可以添加Object类型到List里面去 List<Object>; //定义成这样不可以添加String类型到List里面去 List<? extends Object>; // 这样就可以互等了!这样还可以设定泛型的上限

5)带泛型的类,构造方法写法不变,其后不可以加泛型!

例如:class Student<T>{

public Student<T>(){} // 构造方法这样写就错了

}

6)List<String> 不是 List<Object> 的子类!,不可以把前者看成后者的子类,所以不

可以把前者的实例赋给后者

例如: List<String> Slist = new ArrayList<String>();

Slist.add(new String("abc"));

List<Object> Olist = new ArrayList<Object>();

…… …… 余下全文

篇二 :Java泛型总结

Java泛型总结

1. 什么是泛型?

泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。

可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象。

因为 Map.get() 被定义为返回 Object,所以一般必须将 Map.get() 的结果强制类型转换为期望的类型,如下面的代码所示:

Map m = new HashMap();

m.put("key", "blarg");

String s = (String) m.get("key");

要让程序通过编译,必须将 get() 的结果强制类型转换为 String,并且希望结果真的是一个 String。但是有可能某人已经在该映射中保存了不是 String 的东西,这样的话,上面的代码将会抛出 ClassCastException。

理想情况下,您可能会得出这样一个观点,即 m 是一个 Map,它将 String 键映射到 String 值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。

2. 泛型的好处

Java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。这带来了很多好处:

类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

…… …… 余下全文

篇三 :c#中的泛型总结

c中的泛型总结

泛型

一、泛型体验

泛型是framework 2.0加入的一种特殊的算法重用机制,允许程序员在代码中将变量的类型先用类型占位符来替代,等到运行的时候在根据传入的类来替换。

Demo1

MyList类:

1 public class MyList<T>

2 {

3 T[] arr;

4 public int count=0;

5 public MyList(int length)

6 {

7 arr = new T[length];

8 }

9 public void Add(T t)

10 {

11 arr[count] = t;

12 count++;

13 }

14

15 /// <summary>

16 /// 索引器

17 /// </summary>

18 /// <param name="index"></param>

19 /// <returns></returns>

20 public T this[int index]

21 {

22 get

23 {

24 if (index >= arr.Length)

25 {

26 throw new System.Exception("数组下标越界");

…… …… 余下全文

篇四 :泛型总结

一、 泛型

参数化类型

泛型

泛型总结

可以操作接口、类或方法

1. 泛型的作用

<1>保证编译时的类型正确

<2>代码的复用性强

<3>代码安全性高

classGenericClass<T>{

private t obj;//指定了类型变量的类型 publicGenericClass(T obj){

this.obj=obj;

}

public T getObj(){//指定了方法的返回值类型 Return obj;

}

}

在使用泛型时,使用实例的类型来代替类型变量就可以实例化泛型类型 实例:

泛型类 :具有一个或者多个类型变量的类就是泛型类

泛型总结

泛型总结

泛型总结

泛型总结

泛型总结

继承关系

泛型总结

泛型总结

子类除了继承父类还可以对父类进行拓展

泛型总结

泛型总结

泛型接口

拥有一个或者多个类型变量的接口

泛型总结

泛型总结

定义类型的边界

泛型方法实际就是带有一个或多个类型参数的方法

泛型总结

泛型总结

泛型总结

泛型总结

泛型总结

…… …… 余下全文

篇五 :java泛型基础知识总结

Java泛型

Java泛型是java1.5中引入的新特性,在此之前,java通过对类型Object的引用来实现参数类型的“任意化”,特点则是需要进行显示的强制类型转换。(而这种显示的类型转换可能是无法进行的,是错误的)但编译器无法发现强制类型转换可能引起的异常,异常只有在运行时才能出现,成为了系统的安全隐患。----------------------------为啥要进入泛型这个概念 泛型的本质是参数化类型,及所操作的数据类型被指定为一个参数,此参数类型可以用在类、接口、和方法的声明及创建中,分别被称为泛型类,泛型接口,及泛型方法。 使用注意事项:

泛型的类型参数只能是类类型(包括自定义类),但是不能是简单类型 泛型类型参数可以是多个

泛型的参数类型还可以是通配符类型

没有泛型的错误:

Import java.util.*;

Public class NoGenericTypeDemo{

Public static void main(String[] args)

{

List names=new ArrayList();

Names.add("张桑拿");

Names.add(new Integer(2);

String nameFirst=(String)names.get(0);

String namesecond=(String)names.get(1);//抛出异常jav.lang.ClassCastException异常,而且编译时没有被发现

}

有时候需要使泛型变量能使用任何的类型,此时可以使用通配符”?”否则可能需要编写许多版本的重载函数,使用通配符,使方法printLsit()可以接受各种类型的List对象,否则必须使用重载技术,

Public static void printList(List<?>list)

…… …… 余下全文

篇六 :day18(泛型、Map集合)总结

传智播客----------------------------------------------java 基础 许正 Day18总结

1、泛型类:

在写容器之前想要容器中要存什么?所以要先写好泛型

Eg:TreeSet<Person> ts=new TreeSet<Person>();

有了泛型后强制转换就没有用

Eg:public class Person implements Comparator<Person>{}

对于下面覆盖的它的compare方法就不用强制转换了。

Public int compare(Person p){}这里就不用在做强制转换了。

实现代码:

Public static void main(String[] args){

Tool t=new Tool();

t.setObject(new Cat());

t.setObject(new Dog());这时编译会出现没问题,但是运行时会出现错误,因为发生了类型转换异常,dog不能转换成Cat。

Cat c=(Cat)t.getObject();

Tool<Cat> t=new Tool<Cat>();

t.setObject(new Cat());此时就不用强转了

t.setObject(new Dog()):此时编译就失败,把运行时的异常转到编译时候。

}

Class Cat{}

Class Dog{}

/*

Class Tool{

Private Object obj;

Public void setObject(Object obj){

This.obj=obj;

}

Public Object getObject(){

Return obj;

}

}

*/

改进后

…… …… 余下全文

篇七 :C#泛型列表ListT基本用法总结

C#泛型列表List<T>基本用法总结

示例代码如下:

namespace SampleListT
{
  class Program
  {
      static void Main(string[] args)
      {
          //using System.Collections.Generic; 命名空间中的List<T>
          //using System.Collections; 命名空间中的ArrayList  
          //都实现了列表集合,一个是泛形集合,一个是非泛型的
          //下面我们将Person对象加到集合中

          Person p1 = new Person( "aladdin" , 20 );
          Person p2 = new Person("zhao", 10);
          Person p3 = new Person("jacky", 40);

          //如果不制定list的容器大小,默认是0,只要有元素加入是,会自动扩展到4,如果第5个元素加入时,就变成了8,第9个加入,就成16
          //可以看出,总是成倍的增长,扩展时要重新开辟内存,这样会影响效率,如果事先知道元素个数,或者可能个数,最好给个尽量大的权衡值
          //我们加入3个元素,设容器大小为4.注:设为4不是指只能放4个元素,如果超出,一样也会成倍扩展,这样做只是为了尽量扩展带来的开销
          List<Person> list = new List<Person>(4);
         
          list.Add(p1);
          list.Add(p2);
          list.Add(p3);

          //本方法是清除多于的没有用的内存空间,例:如果开辟大小为100,而我们只用了4个,其余的放着,是不是很浪费 
          //本方法调用时会检查元素个数是不是占到了容器大小的90%以上,如果是,则不进行回收.
          list.TrimExcess();

          //ArrayList方法与List<>用法一样,不同的是,它是对象集合,参数是Object这样会有装箱拆箱的可能,尽量用List<>
          //本处不再做演示

…… …… 余下全文

篇八 :【个人总结系列-47】C C++编程注意问题总结-模板和泛型编程-结构体注意-中文字符读取-产生随机数

C/C++编程注意问题总结-模板和泛型编程-结构体注意-中文字符读

取-产生随机数

1.1.1 C++模板和泛型编程总结 ? 函数模板:函数中有不确定的类型T(或成为模板类型)

template<class T1,class T2>

T1 fun(T2 n)

函数模板在调用时自动根据参数的类型判断产生哪种类型的实例。所以程序员必须自己保证在函数中的类型T能够胜任所参与的运算。比如在函数fun()中有T类型的两个数据进行+运算,则程序员必须保证参数能够进行+运算。

? 类模板

类模板:类中有不确定的类型T(或成为模板类型)

template<class T1,class T2>

class Person{}

类中函数在类外部的实现:必须在每个函数上面加一个template<class T>,以及在类后面用<>说明类中用到的模板类型T,如下所示:

template<class T>

Person<T>::int getAge(){}

类模板在实例化时(声明和new一个类模板时),必须用<具体的T>注明类的类型。凡是实例化一个类模板时(即用这种类时),必须要注明具体的类型。如:

Person<int> p;

new的时候 Person<int> p = new Person<int>("Jim",20);

1.1.2 结构体需要注意的问题

? 结构指针

结构指针:struct string *student;

实际上, student->name就是(*student).name的缩写形式。

需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地址,因此在使用之前应该对结构指针初始化,即分配整个结构长度的字节空间, 这可用下面函数完成, 仍以上例来说明如下: student=(struct string*)malloc(sizeof (struct string));

…… …… 余下全文