灯具网站怎么做,成立公司有什么好处和坏处,网站制作乛薇,高陵微网站建设没有java泛型会存在的问题
假设我们有一个方法#xff0c;希望通过传递不同类型的参数#xff0c;输出不同类型的对象值。正常情况下我们可能会写不同的方法来实现#xff0c;但是这样会导致类不断增加#xff0c;并且类方法很相似#xff0c;不能够复用。进而导致类爆炸…没有java泛型会存在的问题
假设我们有一个方法希望通过传递不同类型的参数输出不同类型的对象值。正常情况下我们可能会写不同的方法来实现但是这样会导致类不断增加并且类方法很相似不能够复用。进而导致类爆炸假设有一个方法我们希望传参具有一定约束而不是像Object对象一样随便传参
java泛型的常见使用
包装类型参数
定义一个方法打印各种包装类型
public class Generics1T {private T name;public Generics1(T name) {this.name name;}public void allPrint(){System.out.println(name);}
}main
public class Main {public static void main(String[] args) {Generics1Integer integerGenerics1 new Generics1(1);integerGenerics1.allPrint();Generics1String stringGenerics2 new Generics1(222222);stringGenerics2.allPrint();Generics1Long longGenerics3 new Generics1(222L);longGenerics3.allPrint();}
}注意泛型里面必须是对象或者包装类型。基础类型是不被允许的 多个包装类型参数
两个泛型参数
public class Generics2T,K {private T name;private K context;public Generics2(T name,K context) {this.name name;this.contextcontext;}public void allPrint(){System.out.println(name);System.out.println(context);}
}Main
public class Main2 {public static void main(String[] args) {Generics2String, Integer stringIntegerGenerics2 new Generics2(1111, 222);stringIntegerGenerics2.allPrint();}
}上界继承
限定使用者传递的参数必须继承某个父类之下
public class Generics3T extends Vehicle {private T name;public Generics3(T name) {this.name name;}public void allPrint(){System.out.println(name.getName());}
}父类
public class Vehicle {private String name;public String getName() {return name;}public void setName(String name) {this.name name;}public void run(String name){System.out.println(namecan run);}
}子类
public class Car extends Vehicle{private Integer wheel;public Integer getWheel() {return wheel;}public void setWheel(Integer wheel) {this.wheel wheel;}public void getWheel(String name,Integer wheel) {System.out.println(name有wheel个轮子);}
}可以不是父 类可以是接口。接口有更好的扩展性
public class Generics4T extends Vehi {private T vehics;public Generics4(T vehics) {this.vehics vehics;}public void allPrint(){vehics.run();}
}接口
public interface Vehi {void run();
}使用上界继承的好处
使用上界继承的最大好处是必然我们会用到接口或者父类那么我们可以抽取一些公共方法放到父类或接口里面。不同的实现拥有不同的处理方式。具备更强的扩展性java里面虽然有Object来实现传递各种类型参数如下但是不推荐这么做。会产生一种。例如当我们从List取值的时候java是无法推断里面值的类型编译器就会报错 上面这个代码在运行时获取第二个值时就会报错。 使用Object在编译阶段是没有问题的但是在运行时就会出现问题。 而使用泛型在编译阶段就能检查出来问题 泛型函数Generic method
泛型函数方法的定义
在返回类型前添加泛型类型 。参数设置为泛型
private static T void printAll(T myOb){
}举例子
public class Main5 {public static void main(String[] args) {printAll(new BigCar(3,myba));}private static T void printAll(T myOb){System.out.println(myOb);}
}同理也可以使用上界继承限定 private static T void printAll(T myOb){System.out.println(myOb);}private static T extends Vehicle Vehi void printAll(T myOb){System.out.println(myOb);
}配置多个参数
private static T,K void printAll2(T myOb,K myob2){System.out.println(myOb);System.out.println(myob2);
}泛型通配符
StringIntegerLong我们在传递参数时可以用Object来定义参数。但是List却不是List的子类。这种情况怎么处理通配符的使用
private static void printAll(List? myOb){System.out.println(myOb);
}上界通配符
意思是传入的参数必须是Vehi的子类或者实现或者本身
private static void printAll(List? extends Vehi myOb){System.out.println(myOb);
}下界通配符
意思是传入的参数必须是Car的父类或者Car本身
private static void printAll(List? super Car myOb){System.out.println(myOb);
}