精华内容
下载资源
问答
  • 1.背景 在Java中,之所以需要强制类型转换是为了防止程序员在不知情情况下把A类型数据错当成B类型数据。将一种类型值赋给另一个类型变量是很常见,如果这两种是兼容,那么Java将执行自动转换,例如int...

    https://blog.csdn.net/czengze/article/details/52976820

    1.背景

          在Java中,之所以需要强制类型转换是为了防止程序员在不知情的情况下把A类型数据错当成B类型的数据。将一种类型的值赋给另一个类型的变量是很常见的,如果这两种是兼容的,那么Java将执行自动转换,例如int和long,将int类型赋值给long类型的变量,总是可行的。但不是所有的类型都兼容。例如,没有将double类型转换为byte型的定义。但是不兼容的类型之间的转换仍然是可能的。达到这个目的,就需要使用强制类型转换。完成两个不兼容类型的强制转换。

    2.自动类型转换和强制类型转换

          在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。

          当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。

    [java] view plain copy
    1. Father father = new Son();  
    2. Son son = (Son)father;  
    3. //编译出错,ClassCastException  
    4. Father father = new Father();  
    5. Son son = (Son) father;  
          在第一个例子中,father被指向一个子类对象,子类也可以指向子类对象。而第二个例子中,father被传给一个父类对象,子类引用不能指向父类对象。即很重要的概念是:父类引用指向子类对象。将父类转换为子类之前,应该用instanceof检查。
    [java] view plain copy
    1. static class One {  
    2.     public void foo() {  
    3.         System.out.println("One");  
    4.     }  
    5. }  
    6. static class Two extends One {  
    7.     public void foo() {  
    8.         System.out.println("Two");  
    9.     }  
    10.     public void dosth(){  
    11.         System.out.println("Two again");  
    12.     }  
    13. }  
    14. public static void main(String[] args) throws Exception{  
    15.     One t = new Two(); //向上转型,即父类引用指向子类对象,此时子类对象的类型为父类的类型  
    16.     t.foo();  
    17.     t.dosth();//编译错误  
    18.     t = (Two)t;   
    19.     t.dosth();//编译错误   
    20.     ((Two) t).dosth();//编译成功  
    21. }  

    向上转型是安全的,但是会有些子类特性会丢失,向下转型可以成功。

          总结:父类引用可以指向子类对象,子类引用不能指向父类对象。把子类对象直接赋给父类引用叫做向上转型,向上转型不用强制转型,如Father f1=new Son(),把指向子类对象的父类引用赋给子类引用叫做向下转型,要强制转型,如Son s1 = (Son)f1。向上转型会丢失子类特有的方法,但是子类overriding父类的方法,子类方法有效。 

          将一种类型的数据赋给另外一种类型变量时,满足下列两种要求将执行自动类型转换:1.两种类型是兼容的;2.目的类型的范围比来源类型大。   

          数据值类型按照范围从小到大为:byte,short,char,int,long,float,double

          例如int类型比所有byte合法类型大,因此不要求显式强制类型转换。对于数字类型,整型和浮点型都是彼此兼容的,但是数字类型和字符类型和布尔类型是不兼容的,字符类型和布尔类型也不是互相兼容的。

          自动类型转换不能满足所有的转换需求,比如int型变量赋值给byte型变量,这种转换不会自动进行,因为byte型比int型范围小。为了完成两种不兼容类型转换,需要用到强制类型转换。

          目标类型指定了要转换成为的类型。例如果将int型转为byte型,int型取值范围大于byte型,它的值将堆byte型范围进行取模。而把浮点型赋值给整数型,就会出现截断,截取掉小数部分。从其他数值类型转换为char类型时,必须进行强制转换。将char类型转换为其他数值类型时,除了byte、short必须强制转换之外,int、long、float、double都不用强制转换。

    [java] view plain copy
    1. byte b;  
    2. int i = 257;  
    3. double d = 32.13;  
    4. b = (byte) i;  
    5. System.out.println("i and b = " + i + " " + b);  
    6. i = (int)d;  
    7. System.out.println("d and i = " + d + " " + i);  
    8. b = (byte)d;  
    9. System.out.println("d and b = " + d + " " + b);  
    10. byte e=(byte)130;   
    11. System.out.println(e);  
    12.    
    13.    
    14. /* 
    15. * output 
    16. i and b = 257 1 
    17. d and i = 32.13 32 
    18. d and b = 32.13 32 
    19. -126 
    20. */  
           当257要转换为byte时,byte的范围是256,所以取模的结果是1。浮点值赋给整数型,截断了小数部分。
    [java] view plain copy
    1. short s = 1;  
    2. s= s + 1;//编译错误  
    3. short s1 = 1;  
    4. s1 += 1;  
          上述陷阱是s = s + 1,s + 1会隐式转换为int型,把int型号赋给short,会造成类型缺失。而s1 += 1相当于s1 = (short)(s1 + 1)会把s1 + 1强制转换为short类型,就不会报错。涉及到写代码的严谨性。

          对于自动装箱和自动拆箱,将一个基本数据类型转换为对应的引用类型时,不必强制转换。将一个基本数据类型的引用类型转换为基本数据类型时,也不必要强制转换。

    [java] view plain copy
    1. int i1 = 10;  
    2. Integer iObj1 = i1;  
    3. Integer iObj2 = new Integer(10);  
    4. int i2 = iObj2;  
         在三目运算符中,会按照算术类型中的提升原则将两端操作提升至统一类型,如果两端有一个操作数是引用类型,则整个表达式结果用Object型表示。

    [java] view plain copy
    1. byte b = 10;   
    2. short s = 20;   
    3. int i = (b == 10) ? b : s;   
    4. int i1 = 10;   
    5. String str = "Hello";   
    6. Object obj = (i1 == 10) ? i1 : str;  // 在这里变量i进行了自动装箱操作  
         int和String互相之间的转换,首先是int转String,有两种方法
    [java] view plain copy
    1. int i = 12345;  
    2. String s = "";  
    3. s = i + "";  
    4. s = String.valueOf(i);  
        第一种方法,s = i + "";会产生两个String对象, s = String.valueOf(i);直接使用String的静态方法。

    [java] view plain copy
    1. String s = "12345";  
    2. int i ;  
    3. i=Integer.parseInt(s);  
    4. i=Integer.valueOf(s).intValue();  
        第一种方法直接使用静态方法,不会产生多余的对象,但会抛出异常。第二种方法相当于new Integer(Integer.parseInt(s))也会抛出异常,但是会多产生一个对象。

          valueOf返回的是原对象,toString()返回的是字符串。

    3.instanceof

          instanceof是Java二元操作符,测试左边对象是否是右边类的实例,返回boolean类型的数据,作用上可以避免强制类型转换失败。

    4.JVM级别原理

          对于强制类型转换,且是引用类型,如果是父类向子类转换,这种只牵扯到引用名义类型的转换,具体的内存没有什么变化。

          而基本类型转换不同,数据发生了变化。但是基本数据类型不是对象,如果涉及到自动装箱和拆箱,实际上是调用类似Integer.parseInt()和Integer.valueOf()实现。

          父类向子类强制转换,如果成功不会有任何数据丢失,如果不是子类,那么会报错。基本类型之间的转换,如果是大范围向小范围的转换,有可能发生数据丢失或者精确丢失。

    展开全文
  • 向下转型时,如果父类引用中子类对象类型和目标类型不匹配,则会发生类型转换异常。 instanceof关键字处理异常 1、向下转型前,应判断引用中对象真实类型,保证类型转换正确性。 2、语法:引用instanceof类型 /...

    异常:

    向下转型时,如果父类引用中的子类对象类型和目标类型不匹配,则会发生类型转换异常。

    instanceof关键字处理异常

    1、向下转型前,应判断引用中的对象真实类型,保证类型转换的正确性。
    2、语法:引用instanceof类型 //返回boolean类型结果

    代码例子:

    public class InstanceofText {
    	public static void main(String[] args) {
    		Animal a = new Dog();
    		
    		if (a instanceof Dog) {
    			Dog dog = (Dog)a;
    			dog.eat();
    		} else if(a instanceof Cat){
    			Cat cat = (Cat)a;
    			cat.eat();
    		}
    		
    	}
    }
    class Animal{
    	String color;
    	String type;
    	
    	public void eat() {
    		System.out.println("动物在吃东西......");
    	}
    	public void run() {
    		System.out.println("动物在奔跑......");
    	}
    }
    
    class Dog extends Animal{
    	int age;
    	
    	public void eat() {
    		System.out.println("狗狗在吃狗粮......");
    	}
    }
    class Cat extends Animal{
    	int age;
    	
    	public void eat() {
    		System.out.println("猫咪在吃小鱼......");
    	}
    }
    
    展开全文
  • ClassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出错误。下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法。 这种异常是如何产生呢?举一个比较形象...

    ClassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误。下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法。
    这种异常是如何产生的呢?举一个比较形象的例子。
    Animal表示动物,Dog表示狗,是动物的子类,Cat表示猫,是动物的子类。看下面的代码:

    Animal a1 = new Dog();  // 1
    Animal a2 = new Cat();  // 2
     
    Dog d1 = (Dog)a1;         //3
    Dog d2 = (Dog)a2;        //4
    

    第3行代码和第4行代码基本相同,从字面意思看都是把动物(Animal)强制转换为狗(Dog),但是第4行代码将产生java.lang.ClassCastException。原因是你要把一个猫(a2这只动物是猫)转换成狗,而第3行中是把狗转换成狗,所以可以。
    从上面的例子看,java.lang.ClassCastException是进行强制类型转换的时候产生的异常,强制类型转换的前提是父类引用指向的对象的类型是子类的时候才可以进行强制类型转换,如果父类引用指向的对象的类型不是子类的时候将产生java.lang.ClassCastException异常。就是上面a1和a2都是动物,但是a1这只动物是一只狗,而a2这只动物是猫,所以要把a1转换成狗可以,因为a1本身就是狗,而a2是一只猫,所以要转换成狗就出错了。
    遇到这样的异常的时候如何解决呢?如果你知道要访问的的对象的具体类型,直接转换成该类型即可。如果不能确定类型可以通过下面的两种方式进行处理(假设对象为o):
    1、通过o.getClass().getName()得到具体的类型,可以通过输出语句输出这个类型,然后根据类型进行进行具体的处理。
    2、通过if(o instanceof 类型)的语句来判断o的类型是什么。

    注意:也就是具有父子关系的才可以转换,兄弟关系的就不可以

    展开全文
  • list为List\类型的对象,但是提示java.lang.ClassCastException: com.ekingstar.common.meeting.MeetingCustom cannot be cast to com.ekingstar.common.meeting.MeetingCustom.新人没有c币,还请大神解答一下
  • 下面代码报类型转换异常 ``` List<String> str = new ArrayList(); str.add("11"); str.getClass().getMethod("add", Object.class).invoke(str, 2); System.out.println(str); for (int i=0;i();i++) {...
  • dev热部署中累加器和本地累加器不一致导致类型转换错误,以后在项目中谨慎使用dev热部署 其次 遇到这样的异常的时候如何解决呢?如果你知道要访问的的对象具体类型,直接转换成该类型即可。如果不能确定类型可以...
        

    dev热部署中累加器和本地累加器不一致导致类型转换错误,以后在项目中谨慎使用dev热部署

    其次
    遇到这样的异常的时候如何解决呢?如果你知道要访问的的对象的具体类型,直接转换成该类型即可。如果不能确定类型可以通过下面的两种方式进行处理(假设对象为o):

    1、通过o.getClass().getName()得到具体的类型,可以通过输出语句输出这个类型,然后根据类型进行进行具体的处理。

    2、通过if(o instanceof 类型)的语句来判断o的类型是什么。

    展开全文
  • // 去除 java.lang.ClassCastException 类型转换异常 Class<Enterprise> clazz = Enterprise.class; final Method getter = BeanUtil.getBeanDesc(clazz).getGetter(fieldVal); final Method setter = ...
  • ClassCastException,从字面意思上看,是类型转换异常,通常是进行强制类型转换时出错误。下面对产生ClassCastException异常原因进行分析, 然后给出这种异常解决方法: 这种异常是如何产生呢?举一个...
  • 自己项目中,有个定时任务模块,里面需要将返回对象强转为某个实体类JobModel,可是在转换的过程中,却报出了java.lang.ClassCastException: ... at com.jy.admin.server....
  • 在项目中,需要使用XStream将xml string转成相应对象,却报出了java.lang....项目中应该是采用了热部署,devtools,因为累加载器不同所以会导致类型转换失败 措施: 在pom.xml中将以下代码注释掉: <...
  • 自己的项目中,在登录时获取登录对象出现了转换异常,可是明明要强制转换的类型和需要转换的类型一样,却报错了。 百度了很久找到一个帖子,原因是因为项目中应该是采用了热部署,devtools,因为累加载器的不同...
  • 什么是强制转换也就是,你用一种类型接受了另一种类型,发生了类型转化,但是类型转换一般 都是向上转型。如 int 转 double,还有 int 转 String。这些都是自动转换不要强制转换, 一般基本类型都提供包装类。如 ...
  • 问题: 项目中运用quartz时遇到,在jobdataMap中放入一个对象: ScheduleJobEntity scheduleJob; jobDetail.getJobDataMap().put(JOB_KEY, scheduleJob); 取出时: ScheduleJobE...
  • 这是标准的类型转换,将object转成String类型的值。使用这种方法时,需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查,以判断是否可以转换。否则容易抛出CalssCastException异常。此外,需...
  • 转自:... Java的类型转换异常(ClassCastException),恐怕是开发中最常见的异常之一,比如你把一个本身为String的对象强行转换成List时,就会抛出此异常。当然,一般情况下这种...
  • 一直刷数据类型转换异常的错误。 开发语言:JAVA JDK版本:java version "1.8.0_211" MongoDB版本:3.2.16 后台日志报错如下: 根据报错提示的java类定位到具体报错代码如下: 由此,可知引起异常...
  • Java对象类型转换

    2020-03-10 08:55:19
    将一个类型强制转换成另一个类型的过程被称为类型转换。本节所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制...Java 中引用类型之间的类型转换(前提是两个类...
  • Java的类型转换异常(ClassCastException),恐怕是开发中最常见的异常之一,比如你把一个本身为String的对象强行转换成List时,就会抛出此异常。当然,一般情况下这种错误很容易就从异常信息中发现原因并纠正,通常...
  • ![图片说明](https://img-ask.csdn.net/upload/201511/19/1447899315_300779.png) 类型不匹配:不能从元素类型 Object 转换为 Map 怎么解决 各位朋友有没有知道这种情况 这是别人源码,反编译出这个错
  • 类型转换异常

    2021-01-06 22:32:44
    <div><p>使用encoder/decoder使用java,返回对象结构格式为:...时出现AnotherClass不能被转化为AnotherClass的类型转换异常报错</p><p>该提问来源于开源项目:alibaba/jetcache</p></div>
  • 根据文档,动态代理时传递第二个参数是一个代理类要实现接口列表.如果传递对象不是接口直接实现类,那么就会报错,可以手动指定. newProxyInstance public static Object newProxyInstance(ClassLoader loader,...
  • 前几天在做一个安卓项目时候一直报java.lang.RuntimeException错,一直调试不出来,今天突然又灵感是不是文件配置出错了,果然在清单文件中少了一句 android:name=".KXApplication"。 02-05 10:19:52....
  • 认识异常一、常见异常二、异常概念三、Java异常体系四、异常处理1....ClassCastException:类型转换异常 NullPointerException:空指针异常 NumberFormatException:数据格式异常 FileNotFoundExceptio
  • 文章目录关于Java的两种类型转换:强类型转换隐式类型转换 关于Java的两种类型转换: 第一种是强类型转换,第二种是弱类型转换. 每种类型转换都存在着一定的风险,只有清晰地去认识它们,才能够少犯错误 强类型转换 强...
  • java强制类型转换

    2015-10-28 20:24:27
    【0】README0.1)本文转自 core java volume 1 ,在强制类型转换部分,它提到了 使用 instanceof 以保证 类型成功转换(而不是抛出异常),很有看点;【1】强制类型转换的相关知识点:1.1)进行类型转换的唯一原因是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,931
精华内容 1,172
关键字:

java的类型转换异常

java 订阅