泛型是什么?
泛型:是可以在编程时,不确定使用某种类型时,用它来代替要使用的类,使之可以接受使用者指定的类,相当于类型参数化.
(百度百科上是这样定义的:1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。)
泛型怎么用?
泛型的用法:1. 泛型方法;2. 泛型类;
-
泛型方法
泛型方法可以使方法根据用户的使用让类型参数化, 可以在接受不同的类型;
java:
public class HelloWorld { public static void main(String[] args) { Print("Hello World"); Print(123); } public static <T> 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>(T printValue) { Console.WriteLine(printValue); }
两个例子的打印结果都是一样的:
Hello World 123
C#中的泛型方法中的泛型参数(T) 是写在方法名称后面
Java中的泛型方法中的泛型参数(T)是写在返回类型的前面
如果要使用多个泛型参数则是在<>中两个参数间用 ","隔开 比如<T,K>
-
泛型类(泛型接口)
泛型类中的泛型的使用区间是在整个类中, 而泛型方法是在整个方法中使用. 并且子类继承这个泛型类,子类也可以使用此泛型(泛型接口同理)
c#
public class GenericDemo<T>
{
public T PrintValue { get; set; }
public void Print()
{
Console.WriteLine(PrintValue);
}
}
public class GenericDemoChild<T> : GenericDemo<T>
{
public void PrintChild()
{
Console.WriteLine("Chlid" + PrintValue.ToString());
}
}
Java
public class Main {
public static void main(String[] args) {
var generic = new GenericDemo<String>();
generic.PrintValue = "Hello World";
generic.Print();
var genericChild = new GenericDemoChild<Integer>();
genericChild.PrintValue = 123;
genericChild.ChildPrint();
}
}
public class GenericDemo<T> {
public T PrintValue;
public void Print( ){
System.out.println(PrintValue);
}
}
public class GenericDemoChild<T> extends GenericDemo<T> {
public void ChildPrint(){
System.out.println(PrintValue);
}
}
C#与Java泛型的的不同之处
c#:
c#中有泛型约束,限制泛型的条件;比如限制泛型的父类必须时某某类型,现在泛型必须有构造函数,必须实现的接口;
public class Generic<T> where T : class , new(){}
where T 后面加上针对 泛型T 约束的条件
class :约束T必须时引用类型;
struct : 约束T必须时值类型;
new() : 必须有无参构造函数(若是有其他约束条件 new()必须放在最后一个约束条件);
一个具体类名: 必须继承自此类;
一个接口名: 必须实现此接口.
java:
通配符 ? 表示泛型中可以任意的类型
public static void main(String[] args) {
List<String> stringlist = new ArrayList<>();
stringlist.add("hel");
stringlist.add("11");
Print(stringlist);
List<Integer> 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类名 表示通配符的上下限