泛型--》JAVA

本文深入讲解Java泛型的概念,包括泛型类、泛型方法、泛型接口等基础知识,并介绍了如何使用通配符解决参数类型不一致的问题。

  JDK1.5之后引进了三大常用特性:泛型,枚举,注解,下面我们来看看泛型!!!

  泛型指的是在类定义的时候并不会设置类中属性或方法中参数的具体类型,而是在类使用时再定义;

 泛型可以定义类,方法,接口:

 1. 泛型类

   **泛型类的基本语法:     

      class MyClass<T>{
          T  value;
     }
   <>中的T被称为类型参数,用于指代任何类型,假如一个类被<T>修饰,那它就称之为泛型类;

   **泛型类在使用的时候需表明类型。

    如:

       MyClass<String>  myClass=new MyClass<>(); 

   **泛型类只能接受类,所有的基本数据类型必须使用包装类。

   **泛型类可以接受多个类型参数,多个类型参数之间用',’隔开。

   &&引用泛型后,如果明确设置了类型,则为设置类型,如果没有设置类型,则默认为Object类;

 2. 泛型方法

   **泛型方法的基本语法: 

     class  MyClass {

         public <T> T  fun(T t){
            return   t;
       }
    }
         **泛型类可以与泛型方法共存。

  **泛型方法始终以自己定义的类型为准

  在程序类中追加了泛型之后,避免了ClassCastException的问题,但是参数不统一,所以,我们需要用到通配符了!!!

 3. 通配符--》?

 有一个方法能接受泛型类的对象,此时,它能接受的只是你规定的类型,一旦传参不是此类型,就会报错,例如:

 

public class Test{

   Message<Integer> message=new Message<>();
    message.setMessage(55);
   fun(message);

  public static void fun(Message<String> temp){
     System.out.println(temp.getMessage);
  }    
}

 此时就会出问题,两者参数不统一,我们需要可接受所有泛型类型,但又不能被随意修改,这种情况需要使用通配符来处理:

  

  public static void fun(Message<?> temp){
     System.out.println(temp.getMessage);
  }
 此时,通配符可允许接受任意类型,但由于是不确定类型,所以无法修改;

 ****在此基础上,产生了两个子通配符:? extends 类   和   ? super  类

   ? extends 类 --->设置泛型上限(只能接受此类及其子类)

   ? super  类 ----->设置泛型下限(只能接受此类及其父类)

   **上限可以用在类声明,不能被修改,下限只能用在方法参数,可以修改内容;

  4. 泛型接口

   ***泛型接口的基本语法:  

interface IMessage<T>{

   public  void  print(T t);


}
   对于泛型接口的实现子类有两种做法:

   (1) 子类在定义时继续使用泛型;

   (2)  子类在实现接口的时候明确给出具体类型;

  5. 类型檫除

       **泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息都会被檫除,此为类型檫除;(通俗来说,泛型类和普通JAVA类在java虚拟机内没什么不一样)

      **在泛型类被类型檫除的时候,之前泛型类中的类型参数部分如果没有指定上限,会被译成Object类,如果指定了上限,则类型参数就会被替换成类型上限。


 

Java中,是一种强类型机制,它可以让你在编译时检查类型错误,从而提高代码的安全性可读性。在使用时,我们经常会遇到父类子类的转换问题。 首先,我们需要明确一点:子类不能转换成父类。这是因为Java中的是不协变的。例如,如果有一个类A它的子类B,那么List<A>List<B>之间是不存在继承关系的。 下面我们来看一个例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 } } ``` 在这个例子中,我们定义了Animal类它的子类Dog。然后我们定义了两个List,分别是List<Animal>List<Dog>。如果将List<Dog>赋值给List<Animal>,会出现编译错误。这是因为List<Animal>List<Dog>之间不存在继承关系。 那么,如果我们想要让子类转换成父类,应该怎么办呢?这时我们可以使用通配符来解决问题。通配符可以表示任意类型,包括父类子类。例如,我们可以将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类转换成父类了。 下面我们来看一个使用通配符的例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 List<? extends Animal> list3 = new ArrayList<>(); list3 = list2; // 正确 } } ``` 在这个例子中,我们定义了List<? extends Animal>来表示任意继承自Animal的类型。然后我们将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类转换成父类了。 总结一下,Java中的是不协变的,子类不能转换成父类。如果需要实现子类转换成父类,可以使用通配符来解决问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值