为什么要使用泛型?怎么用泛型?

一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型,我们在获取这个类型的时候拿到的也是Object,虽然可以进行强制转换,但是可能会发生类型转换异常java.lang.ClassCastException运行时异常,比如:

public static void main(String[] args) {
//        method1();
        Map<String, Object> map = new HashMap<>();
        map.put("key1", "123");
        map.put("key2", 456);
        System.out.println((String) map.get("key1"));//123
        System.out.println((String) map.get("key2"));//java.lang.ClassCastException
    }

这样在我们取map的值时,必须一一对应使用正确的类型来进行强转,很容易就会出错,但是如果用泛型就可以将异常提前在编译期就暴露出来,比如:

 public static void main(String[] args) {
//        method1();
//        method2();
        Map<String, String> map = new HashMap<>();
        map.put("key1", "123");
        map.put("key2", 456);//编译不通过
        System.out.println((String) map.get("key1"));
        System.out.println((String) map.get("key2"));
    }

总结就是将运行时期的ClassCastException,转移到了编译时期变成了编译失败。 避免了类型强转的麻烦。

当然这只是最基本的用法,先来说下泛型一共有多少种用法,以及使用的格式

  • 定义和使用含有泛型的类 ,格式:修饰符 class 类名<代表泛型的变量> {  }  public Class ArrayList<E>
  • 定义和使用含有泛型的方法,格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }  public <E> void method(E e)
  • 定义和使用含有泛型的接口,格式:修饰符 interface接口名<代表泛型的变量> {  }  public interface<E>

其中含有泛型的接口有两种情况:(泛型类好像也可以)

public MyTest  implements Test<String>

public MyTest<T> implements Test<T>

泛型通配符

当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配 符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

泛型的上限:

  • 格式: 类型名称 <? extends 类 > 对象名称
  • 意义: 只能接收该类型及其子类

泛型的下限:

  • 格式: 类型名称 <? super 类 > 对象名称
  • 意义: 只能接收该类型及其父类

引用下大佬的文章:https://blog.csdn.net/s10461/article/details/53941091

原文地址:https://www.cnblogs.com/chenglei0718/p/11408911.html

时间: 2024-10-11 21:16:59

为什么要使用泛型?怎么用泛型?的相关文章

类型安全---泛型与非泛型

============================================================非泛型 -------------------------LinkedListNode.cs类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplicati

Java 泛型 Java使用泛型的意义

Java 泛型 Java使用泛型的意义 @author ixenos 直接意义 在编译时保证类型安全 根本意义 a) 类型安全问题源自可复用性代码的设计,泛型保证了类型安全的复用模板 b) 使用复用性模板时不用手动强制类型转换 三种泛型实现方式的优缺点 C++:模板方式实现,在编译时完全展开并且支持偏特化,类型精度高,代码共享差: Java 5:擦除方式实现,仅用于编译时类型检查,在运行时擦除,向后兼容性好,代码共享好,类型精度非常差: C# 2.0:混合方式实现,在运行时展开特化,类型精度高,

.NET泛型与非泛型的问题

泛型集合通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员.下面的泛型类型对应于现有的集合类型:1.List 是对应于 ArrayList 的泛型类.2.Dictionary 是对应于 Hashtable 的泛型类.3.Collection 是对应于 CollectionBase 的泛型类.4.ReadOnlyCollection 是对应于 ReadOnlyCollectionBase 的泛型类.5.Queue.Stack 和 Sort

为什么要使用泛型?泛型和非泛型对比

using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 泛型和非泛型对比 { class Program { static void Main(string[] args) { testGeneric

Java泛型 VS C#泛型 (伪泛型 VS 真泛型)

一.泛型的本质 泛型是参数化类型的应用,操作的数据类型不限定于特定类型,可以根据实际需要设置不同的数据类型,以实现代码复用. 二.Java泛型 Java 泛型是Java1.5新增的特性,JVM并不支持. 实现原理:Java源代码里面类型提供实现泛型功能,而编译后Class文件类型就变成原生类型(即类型被擦除掉),而在引用处插入强制类型转换以实现JVM对泛型的支持.本质是Java泛型只是Java提供的一个语法糖,底层 的JVM并不提供支持,Java中的泛型属于伪泛型. 但是编译后的字节码通过反射后

自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用

通配符 T, K, V, E 等泛型字母为有类型, 类型参数赋予具体的值 ? 未知类型 类型参数赋予不确定值, 任意类型 只能用在 声明类型上,方法参数上, 不能用在定义泛型类上 上限 extends, 指定类型必须是继承某个子类. 或者实现某个接口 (不是用 implements), 即 <= 如 ? extends Fruit ? extends List 不能添加信息 存在以下规则, 如 List<Fruit> 满足 List<? extends Fruit> List

高效代码指泛型代替非泛型

用泛型代替非泛型,提高效率. 今天测试了一下使用泛型和非泛型的效率问题,结果一目了然. 例子代码如下: public class Test { static int collectionCount = 0; static Stopwatch watch = null; static int testCount = 1000000; public static void TestBegin() { GC.Collect();////强制对所有代码进行垃圾回收 GC.WaitForPendingFi

19._6泛型继承之泛型继承普通类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _19._6泛型继承之泛型继承普通类 { public abstract class baseClasss//普通基类的创建 { protected int user_name;//定义字段 public virtual int user_Name

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型.利用"参数化类型"将类型抽象化,从而实现灵活的复用.在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率.更重要的是,C#的泛型比C++的模板使用更加安全,并且通过避免装箱和拆箱操作来达到性能提升的目的.因此,我们很有必要掌握并善用这个强大的语言特性. C#泛型特点: 1.如果实例化泛型类型的参数相同,那么JIT编辑器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能

Java中泛型区别以及泛型擦除详解

一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种编译器使用的范式,语法糖的一种,能保证类型安全.[注意:继承中,子类泛型数必须不少于父类泛型数] 为了方便理解,我将泛型分为普通泛型和通配泛型 三.泛型分类 1.普通泛型 就是没有设置通配的泛型,泛型表示为某一个类. 声明时: class Test<T>{...} 使用时: Test<Int