Point类复制代码
- class Point{
- private Object x;
- private Object y;
- public void setX(Object x){
- this.x = x;
- }
- public void setY(Object y){
- this.y = y;
- }
- public Object getX(){
- return this.x;
- }
- public Object getY(){
- return this.y;
- }
- }
使用整数表示坐标:复制代码
- public class GenericsDemo{
- public statci void main(String[] args){
- Point p = new Point();
- p.setX(10); //利用自动装箱操作:int --> Integer -->Object
- p.setY(20); //利用自动装箱操作:int --> Integer -->Object
- int x = (Integer)p.getX(); //取出数据先变为Integer,之后自动拆箱
- int y = (Integer)p.getY(); //取出数据先变为Integer,之后自动拆箱
- System.out.println("整数表示,X坐标为:" + x);
- System.out.println("整数表示,Y坐标为:" + y);
- }
- }
使用小数表示坐标复制代码
- public class GenericsDemo {
- public static void main(String[] args) {
- Point p = new Point();
- p.setX(10.5f); //利用自动装箱操作:float --> Float -->Object
- p.setY(20.6f); //利用自动装箱操作:float --> Float -->Object
- float x = (Float) p.getX();//取出数据先变为Float,之后自动拆箱
- float y = (Float) p.getY();//取出数据先变为Float,之后自动拆箱
- System.out.println("小数表示,X坐标为:" + x);
- System.out.println("小数表示,Y坐标为:" + y);
- }
- }
使用字符串表示坐标以上三个程序已经证明Point类符合要求,但是是存在问题的。复制代码
- public class GenericsDemo {
- public static void main(String[] args) {
- Point p = new Point();
- p.setX("东经180度"); //String --> Object
- p.setY("北纬210度"); //String --> Object
- String x = (String) p.getX(); //取出数据
- String y = (String) p.getY(); //取出数据
- System.out.println("字符串表示,X坐标为:" + x);
- System.out.println("字符串表示,Y坐标为:" + y);
- }
- }
2.泛型的应用程序出现类转换异常,因为String类无法向Integer类转换。出现这个问题的原因就是Point类中使用了Object类型接收属性,造成了类型安全问题,要绝解决这个问题就需要使用泛型。复制代码
- public class GenericsDemo {
- public static void main(String[] args) {
- Point p = new Point();
- p.setX(10);
- p.setY("北纬210度");
- int x = (Integer) p.getX();
- int y = (Integer) p.getY();
- System.out.println("整数表示,X坐标为:" + x);
- System.out.println("整数表示,Y坐标为:" + y);
- }
- }
[访问权限] class 类名称{泛型对象定义:
[访问权限] 泛型类型标识 变量名称;
[访问权限] 泛型类型标识 方法名称(){};
[访问权限] 返回值类型声明 方法名称(泛型类型标识 变量名称){};
}
类名称 对象名称 = new 类名称();声明泛型:
关于整型设置的问题:复制代码
- class Point<T>{ //此处可以是任意的标识符号
- private T var; //此变量的类型由外部决定
- public T getVar(){ //返回值的类型由外部指定
- return var;
- }
- public void setVar(T var){ //设置的类型由外部指定
- this.var = var;
- }
- }
- public class Demo01 {
- public static void main(String[] args) {
- Point<Integer> integerPoint = new Point<Integer>(); //里面的var类型为Integer类型
- integerPoint.setVar(30); //设置数字,自动装箱
- System.out.println(integerPoint.getVar()*2); //计算结果按数字取出。
- }
- }
只能使用包装类;在泛型的指定中是无法使用基本数据类型的,必须设置成一个类,这样在设置一个数字时就必须使用包装类。注意:
如果传进来的值和泛型所指定的类型不一致,则在编译的时候会报错。加入泛型后使得程序的操作更加安全,避免了类型转换异常(ClassCastException)的发生。
3.指定多个泛型类型复制代码
- class Point<T>{ //此处可以是任意的标识符号
- private T var; //此变量的类型由外部决定
- public Point(T var){ //构造方法
- this.var = var;
- }
- public T getVar(){ //返回值的类型由外部指定
- return var;
- }
- public void setVar(T var){ //设置的类型由外部指定
- this.var = var;
- }
- }
- public class Demo01 {
- public static void main(String[] args) {
- Point<String> p = null;
- p = new Point<String>("Java");
- System.out.println(p.getVar());
- }
- }
设置多个泛型类型3.泛型的安全警告复制代码
- class Notepad<K,V>{
- private K key;
- private V value;
- public K getKey() {
- return key;
- }
- public void setKey(K key) {
- this.key = key;
- }
- public V getValue() {
- return value;
- }
- public void setValue(V value) {
- this.value = value;
- }
- }
- public class Demo01 {
- public static void main(String[] args) {
- Notepad<String, Integer> notepad = null;
- notepad = new Notepad<String, Integer>();
- notepad.setKey("工资");
- notepad.setValue(30000);
- System.out.println("资金来源:" + notepad.getKey());
- System.out.println("金额:" + notepad.getValue());
- }
- }
不指定泛型类型以上程序会在编译的时候出现警告,但是并不影响程序的运行。复制代码
- class Info<T>{
- private T var;
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class Demo01 {
- public static void main(String[] args) {
- Info info = new Info(); //警告没有指定泛型类型
- info.setVar("Java");
- System.out.println("内容:" + info.getVar());
- }
- }
如果没有指定泛型类型,则所有的类型统一使用Object进行接收
以上程序的var属性实际就变成了Object类型,也就是相当于在定义时将泛型擦除了。
以上程序相当于下面这个程序:复制代码
- public class Demo01 {
- public static void main(String[] args) {
- Info<Object> info = new Info<Object>(); //指定Object为泛型类型
- info.setVar("Java");
- System.out.println("内容:" + info.getVar());
- }
- }
使用泛型声明后的对象引用传递问题通配符:程序在编译时会报错。复制代码
- class Info<T>{
- private T var;
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class Demo01 {
- public static void main(String[] args) {
- Info<String> stringInfo = new Info<String>(); //指定String为泛型类型
- stringInfo.setVar("Java"); //为属性赋值
- fun(stringInfo); //错误无法传递
- }
- public static void fun(Info<Object> temp){ //此处可以接收Object泛型类型的Info对象
- System.out.println("内容:" + temp);
- }
- }
<img alt="image-20220718152739892" loading="lazy">
注意:尽管String是Object类的子类,但是在进行引用传递时也同样无法进行操作。
可以将方法fun()中定义的Info(Object)修改为Info,即不指定泛型。
如下:但是这样做时,Info中并没有指定任何的泛型类型,是不妥当的。为了解决这个问题可以使用Java中的通配符"?"复制代码
- class Info<T>{
- private T var;
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class Demo01 {
- public static void main(String[] args) {
- Info<String> stringInfo = new Info<String>(); //指定String为泛型类型
- stringInfo.setVar("Java"); //为属性赋值
- fun(stringInfo);
- }
- public static void fun(Info temp){ //此处可以接收Info对象
- System.out.println("内容:" + temp);
- }
- }
使用通配符"?"注意:复制代码
- class Info<T>{
- private T var;
- public T getVar() {
- return var;
- }
- public void setVar(T var) {
- this.var = var;
- }
- }
- public class Demo01 {
- public static void main(String[] args) {
- Info<String> stringInfo = new Info<String>(); //指定String为泛型类型
- stringInfo.setVar("Java"); //为属性赋值
- fun(stringInfo);
- }
- public static void fun(Info<?> temp){ //此处可以接收Object泛型类型的Info对象
- System.out.println("内容:" + temp);
- }
- }
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |