`
一顿饺子
  • 浏览: 51697 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义泛型的使用

    博客分类:
  • Java
阅读更多
自定义泛型
自定义泛型的小例子
第一个例子
1:方法:
private  int add(int x,int y) {
  return x+y;
}
当调用该方法的时候
this.add(3,5);
this.add(“3”,”5”)编译器会报错。因为add()方法的参数是String
那么如何做到通用呢?方法是采用泛型
private T add(T x,T y) {
   return x+y;
}
T是什么东西呢?T可以理解为Type的简称,就是代表着一种类型。一种模糊的类型,说不准是什么类型,他是什么类型是由你传过来的实参类型来决定的。
采用如上方法,你会发现,编译出现错误。因为你写了T编译器不知道这个T是什么东西。所以你要告诉T是什么东西,让编译器认识他。在返回类型前加上<T>就可以了,如下
    private <T> T add(T x,T y) {
       return x+y;
}
改成如上方法后,你会发现return x+y编译错误,因为对于T来讲”+”操作符不知道是否存在。
所以 不能用X+Y,这里我们只是为了说明泛型,所以就先让他返回NULL
    private <T> T add(T x,T y) {
       return null;
}这样编译就不会报错了
再次调用
this.add(3,5);
  this.add(3.5,4);
this.add(“aa”,”bb”);
就不会出错了
第二个例子 交换数组元素的位置
交换方法:
private <T> void swap(T arr[],int x,int y) {
T temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;

}
调用交换方法:
  testT.swap(new String[]{"1","2"}, 0,1);
  testT.swap(new int[]{1,2}, 0, 1);
你会发现参数为new int[]时,编译器报错,因为只有引用类型才能替换泛型<T>,那么为什么第一个小例子中调用this.add(3,5)时,用3,5替代T x,T y呢,因为Jvm会把没有显示注明类型的3,5会当成Interger,所以不会报错,但是当用new int[]时,显示注明了int,jvm不能随便就转换成Interger,他就是一个int,所以不能替换<T>

定义泛型的时候可以用extends限定类型 T extends Object 说明你定义的这个模糊类继承Object,即T必须是Object

以上说的都是针对方法的泛型,下面我们说说类的泛型
为什么会出现类的泛型,有什么用?
比如:我们需要一个通用的Dao ,封装一下CRUD操作,根据传入的对象,来惊醒CRUD该对象。按照我们上面所知道的,方法的泛型,Dao应该是下面那样的



DAO:public class TestDao {
   //增加
public <T> void add(T x) {
}
  //查询
public <T> T findById(int id) {
return null ;
}
}
实际调用时:
       我要增加一个狗
  New TestDao().add(new Dog());
      却可以查询出一个猫来
      Cat cat =New TestDao().findById(1);
这样肯定是不可以的,那么如何做到,Dao中所有方法操作的对象必须一致呢,如果你增加的是狗,那么这个Dao对象所有的方法都是针对狗的,不应该用这个Dao还可以查出别的对象来。
采用类的泛型就可以做到一点
修改Dao如下
   public class TestDao<T> {
public void add(T x) {
}
public T findById(int id) {
return null ;
}
}
在类名的后面表上<T>就可以控制了
实际调用时:
//这句话就说明,这个Dao是操作Dog的DAO
TestDao<Dog> dao = new TestDao<Dog>();
Dao.add(New Dog());
//如果你写成Dao.add(New Cat())编译器就会报错
Dog dog = dao.findByName(1);
如果你写成Cat cat =dao.findByName(1)编译就会报错
注意:在类的泛型中,不能包含静态的变量和静态的方法,因为,泛型类是通过new的时候传入一个实参类型,把泛型确定的,如果有静态的,直接用类名去调用,泛型类不知道是什么类型的,所以报错,如果想在泛型类中用静态方法,则在那个静态方法中使用方法泛型
public class TestDao<T> {
public void add(T x) {
}
public T findById(int id) {
return null ;
}
public  static <E> E delete(E x) {
return null;
}

}
0
2
分享到:
评论
2 楼 一碗三餐 2012-02-28  
private T add(T x,T y) {
   return x+y;
}
你觉得对吗?
1 楼 Johnhe 2010-08-02  
抄袭人家的东西。没有自己的见解

相关推荐

    Java.SE 自定义泛型与泛型的常见陷阱

    Java.SE 自定义泛型与泛型的常见陷阱Java.SE 自定义泛型与泛型的常见陷阱

    实例185 - 自定义泛型化数组类

    "实例185 - 自定义泛型化数组类"是一个关于如何创建和使用自定义泛型数组类的示例,这个主题将深入探讨泛型、数组以及两者的结合。 首先,我们需要理解泛型的基本概念。泛型是Java 5引入的一个重要特性,它允许我们...

    自定义泛型实现元素交换

    本话题主要探讨如何自定义泛型集合,并实现其中元素的交换功能。 首先,让我们从创建一个泛型集合类开始。这个类将继承自`System.Collections.Generic.List&lt;T&gt;`,因为它提供了基本的集合操作,并且是泛型的,因此...

    自定义泛型集合

    6. **实际类型的使用**:在使用自定义泛型集合时,我们需要指定具体的类型。例如,如果我们创建一个`CustomList&lt;Integer&gt;`,那么这个列表就只能存储整数。 7. **类型推断**:从Java 7开始,我们可以使用钻石操作符`...

    c#自定义泛型类的实现

    在C#编程语言中,自定义泛型类是一种强大的工具,它允许我们创建可以处理多种数据类型的类。泛型提供了一种方式,让我们能够在编写代码时推迟对具体数据类型的决定,直到实例化类或者调用方法时。这提高了代码的重用...

    尚硅谷-实验2:自定义泛型类的使用.pdf

    ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的方方面面,全而不冗余 ·全程内容涵盖数据结构、设计模式、JVM内存...

    c# 自定义泛型链表类的详解

    本文将深入解析如何在C#中自定义泛型链表类及其使用方法。 首先,让我们分析给出的代码片段。`GenericList&lt;T&gt;` 是自定义的泛型类,这里的 `T` 是类型参数,代表任何数据类型。在C#中,泛型允许我们创建可重用的组件...

    .NET基础之自定义泛型分析

    本文实例分析了.NET基础之自定义泛型。分享给大家供大家参考。具体分析如下: 在.NET中泛型使用非常频繁,在控制台应用程序中,默认的引入了System.Collection.Generics名称空间,其中就提供了我们经常使用的泛型:...

    C#通过反射创建自定义泛型

    本篇将详细介绍如何通过反射来创建自定义泛型。 泛型是C#中的一个重要特性,它允许我们在编写类、接口和方法时引入类型参数,从而提高代码的重用性和安全性。自定义泛型类允许我们定义一个通用模板,该模板可以在多...

    简单的List泛型模拟

    在Java编程语言中,泛型是一种强大的特性,它允许我们在编写代码时指定容器(如List、Set、Map等)所存储的数据...通过模拟泛型列表,我们可以更好地理解类型擦除、类型参数绑定以及如何在没有泛型的旧代码中使用泛型。

    Java-Custom-Generics:在 Java 中使用自定义泛型的简单示例

    在Java中,自定义泛型主要是指在我们自己编写的类、接口或方法中使用泛型。这个“Java-Custom-Generics:在 Java 中使用自定义泛型的简单示例”很可能是为了展示如何在实际编程中应用泛型。 泛型的引入旨在提高代码...

    实例讲解Java泛型编程的快速入门

    - 泛型方法是在方法声明中使用类型参数,如`public &lt;T&gt; T max(List&lt;T&gt; list)`,这个方法可以找到列表中的最大值,无论列表包含何种类型。 - 泛型方法的类型参数独立于类的类型参数,因此可以在非泛型类中定义泛型...

    C# 泛型委托示例 应用解析

    这是一个泛型委托的示例,主要是让初学者了解泛型委托的用法,虽然很简单,但是代码有注释,我的这个例子是在vs2010中做的,用vs08的朋友们,最好还是转一下,但是绝对能实现(本程序是控制台应用程序,适合初学者)...

    泛型自定义数组大小

    自定义泛型类可以模拟数组的行为,但比数组更灵活。我们可以通过泛型类定义一个可以容纳任意类型对象的容器,同时规定容器中元素的类型。这样可以确保添加到容器中的元素都是同类型的,从而提高代码的健壮性。 4. ...

    实例183 - 自定义非泛型栈结构

    在这个实例中,我们将探讨如何不使用泛型(Generic)来创建一个自定义的栈结构。 描述中提到的博客链接可能提供了具体的代码实现和详细解释,但由于这里没有实际的链接内容,我会基于通用知识来解释自定义栈的创建...

    Jdk15泛型的实现

    #### 使用与自定义泛型 在使用泛型类或泛型算法时,理解类型参数的约束至关重要。例如,如果一个泛型类声明了类型参数`T extends Comparable&lt;T&gt;`,那么`T`必须是一个实现了`Comparable`接口的类型。这确保了使用该...

Global site tag (gtag.js) - Google Analytics