泛型-Java与C#

泛型.jpg

泛型是什么?

​ 泛型:是可以在编程时,不确定使用某种类型时,用它来代替要使用的类,使之可以接受使用者指定的类,相当于类型参数化.

​ (百度百科上是这样定义的:1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。)

泛型怎么用?

​ 泛型的用法:1. 泛型方法;2. 泛型类;

  1. 泛型方法

    泛型方法可以使方法根据用户的使用让类型参数化, 可以在接受不同的类型;

    java:
    public class HelloWorld {
        public static void main(String[] args) {
            Print("Hello World");
            Print(123);
        }
        
     public  static  void Print (T printValue){
            System.out.println(printValue);
        }
    }
    
    c#
    static void Main(string[] args) 
    {
          Print("Hello world");
          Print(123);
          Console.Read();
    }
    
    public static void Print(T printValue)
    {
     Console.WriteLine(printValue);
    }
    

    两个例子的打印结果都是一样的:

    Hello World
    123
    

​ C#中的泛型方法中的泛型参数(T) 是写在方法名称后面

​ Java中的泛型方法中的泛型参数(T)是写在返回类型的前面

​ 如果要使用多个泛型参数则是在<>中两个参数间用 ","隔开 比如

  1. 泛型类(泛型接口)

    泛型类中的泛型的使用区间是在整个类中, 而泛型方法是在整个方法中使用. 并且子类继承这个泛型类,子类也可以使用此泛型(泛型接口同理)

c#
    

 public class GenericDemo
    {
        public T PrintValue { get; set; }
        public void Print()
        {
            Console.WriteLine(PrintValue);
        }
    }

    public class GenericDemoChild : GenericDemo
    {
        public void PrintChild()
        {
            Console.WriteLine("Chlid" + PrintValue.ToString());
        }
    }
Java
public class Main {
    
    public static void main(String[] args) {
        var generic = new GenericDemo();
        generic.PrintValue = "Hello World";
        generic.Print();
        var genericChild = new GenericDemoChild();
        genericChild.PrintValue = 123;
        genericChild.ChildPrint();
    }
}
 public class GenericDemo {
     
    public T PrintValue;

    public void Print(  ){
        System.out.println(PrintValue);
    }
}
public class GenericDemoChild extends  GenericDemo {
    
    public void ChildPrint(){
        System.out.println(PrintValue);
    }
}

C#与Java泛型的的不同之处

c#:

​ c#中有泛型约束,限制泛型的条件;比如限制泛型的父类必须时某某类型,现在泛型必须有构造函数,必须实现的接口;

public class Generic where T : class , new(){}

where T 后面加上针对 泛型T 约束的条件

class :约束T必须时引用类型;

struct : 约束T必须时值类型;

new() : 必须有无参构造函数(若是有其他约束条件 new()必须放在最后一个约束条件);

一个具体类名: 必须继承自此类;

一个接口名: 必须实现此接口.

java:

​ 通配符 ? 表示泛型中可以任意的类型

    public static void main(String[] args) {

        List stringlist = new ArrayList<>();
        stringlist.add("hel");
        stringlist.add("11");
        Print(stringlist);
        List intList = new ArrayList<>();
        intList.add(11);
        intList.add(22);
        Print(intList);
    }
    public static void Print(List list){
        System.out.println(list);
    }

上面的例子可以正确输出.

在通配符?后面加上 super(下) class类名 或者 extends(上) class类名 表示通配符的上下限

你可能感兴趣的:(泛型-Java与C#)