泛型中<T> 与 T 的区别
1. 泛型的概念
泛型的本质:类型参数化或者参数类型化,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制类型。
2. 为什么需要有泛型
对于为什么需要有泛型我们可以从反向考虑,如果没有泛型的话会带来哪些不方便?
一般的类和方法,只能使用具体的类型;要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。
例如:
public class Animal {
private Dog dog;
public void paly(Dog dog){
System.out.println(dog.getClass().getSimpleName()+": "+dog.getName()+" play game" );
}
public static void main(String[] args) {
Animal animal=new Animal();
animal.paly(new Dog("jack"));
}
}
class Dog{
private String name;
public Dog(String _name){
this.name=_name;
}
public String getName(){
return name;
}
}
Animal类中的paly方法只能接收Dog这一个类型,如果需要扩展的话就需要新增方法,这样会带来代码的冗余。如果我们加入泛型的话扩展性就会大大提升,而且编译器还能在编译器为程序提供类型检查。
public <T> void paly1(T obj){
System.out.println(obj.getClass().getSimpleName()+": play game" );
}
public static void main(String[] args) {
Animal animal=new Animal();
animal.paly(new Dog("jack"));
animal.paly1(new Cat("TOM"));
}
3. 泛型的表现形式
- 泛型类:
public interface Generator<T>{
T next();
}
- 泛型方法
public <T> void paly1(T obj){
System.out.println(obj.getClass().getSimpleName()+": play game" );
}
注:
使用泛型方法的基本原则:尽量使用泛型方法。也就是说,如果使用泛型方法可以取代整个类泛型化,那么久应该只使用泛型方法,因为它可以使事情更加清楚明白。
4. 实际应用
针对<T>和T的理解:
public <T> T get(T a):<T>是指这是一个泛型,第二个T是指函数返回的参数,第三个T是函数中的参数
一般泛型有约定的符号:E 代表 Element, 通常在集合中使用;T 代表 Type,通常用于表示类;K 代表 Key,V 代表 Value,<K, V> 通常用于键值对的表示;? 代表泛型通配符。
public class daylearn1 {
public static void main(String[] args) {
Gen2<String> var2=new Gen2<>();
//这个时候就限定了var1.getValue中参数类型->必须为String类型
if(var2.getValue("58") instanceof String){
System.out.println("var2.getValue() = " + var2.getValue("58"));
}
Gen3 var3=new Gen3();
//这个时候未限定var3.getValue中参数类型-
System.out.println("var3.getValue() = " + var3.getValue(8));
}
}
/**
* 这样写报错提示为:无法解析符号K
* class Gen1{
* public K getNum(K value){
* return value;
* }
* }
*
* */
class Gen2<K>{
public K getValue(K value){
return value;
}
}
class Gen3{
public <K> K getValue (K value){
return value;
}
}
关于泛型中的通配符可参考文献:
https://blog.csdn.net/lisheng19870305/article/details/110010421