精华内容
下载资源
问答
  • java中子类强转父类,实际上依然是子类; 该引用只能调用父类中定义的方法和变量; 如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法; Java 父类强转子 只有父类对象本身...

    Java 继承
    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

    Java 子类强转父类
    父类引用指向子类对象:
    java中子类强转父类,实际上依然是子类;
    该引用只能调用父类中定义的方法和变量;
    如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;

    Java 父类强转子类
    只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象.

    在DTO层与entity层分开时,DTO层继承entity,再给DTO层赋值时不能直接将entity转为dto,因为子类有些属性,父类没有,所以强转会出现错误。
    但是又需要这样强转,怎么办呢,如果手动的取出父类的属性依次填入,这样很耗时。

    解决方案是先把父类转jsonstring再把jsonstring转子类。剩余的子类值可以设定进去。这样两个类的重复值就不用重新设置值了。

    import com.alibaba.fastjson.JSONObject;
    
    public class test {
        
        public static void main(String[] args) {
            B b = new B();
            b.setB("1");
            String ob = JSONObject.toJSONString(b);
            A a = (A)JSONObject.parseObject(ob, A.class);
            a.setA("2");
            System.out.println(a.getA());
        }
    }
    
    class A extends B {
        private String a;
    
        public String getA() {
            return a;
        }
    
        public void setA(String a) {
            this.a = a;
        }
    }
    
    class B {
        private String b;
    
        public String getB() {
            return b;
        }
    
        public void setB(String b) {
            this.b = b;
        }
    }
    
    
    
    展开全文
  • 在运行下面这段代码时报了一个无法强转错误Ljava.lang.Object; cannot be cast to [Lja...

    在运行下面这段代码时报了一个无法强转的错误Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

    public class Demo {
        public static void main(String[] args) {
    
            ArrayList<String> stringArrayList = new ArrayList<String>();
            stringArrayList.add("abc");
            stringArrayList.add("efg");
            stringArrayList.add("hij");
            
            String[] s = (String[]) stringArrayList.toArray();
        }
    }
    

    一开始考虑的是,明明stringArrayList.toArray()作为一个数组其中的元素都来自String类型的字符串,但为什么不能强转。其实不能强转的原因在于stringArrayList.toArray()中的元素虽然来自”String“类型,但是该数组却是一个Object[]类型,自然也无法强转为String[]类型。换句话说一个Object[]类型的对象无法强转为String[]类型的对象。另外这里如果要强转只能将数组中的元素单独拿出来,对单个元素进行强转。为了更清楚的说明我们运行下面这段代码:

    public class Demo {
        public static void main(String[] args) {
            String[] s1 = {"abc", "efg", "hij"};
            Object[] s2 = s1;
            String[] s3 = (String[]) s2;  // 可以强转
    
            Object[] s4 = {"abc", "efg", "hij"};
            String[] s5 = (String[]) s4;  // 报错,不可以强转
        }
    }
    

    考虑上述代码中为什么s2虽然是Object[]类型但能够强转为’String[]'类型的s3。原因在于变量s2虽然是Object[]类型,但是其指向了一个String[]类型的对象,‘String[]’类型与’Object[]'类型是存在继承关系的。而下面的s4之所以不能强转为s5是因为s4变量所指对象类型为Object[]s5类型不存在继承关系。

    总结

    多态是面向对象的三大特性之一,它涉及父类/接口的变量引用子类/实现类的对象。一个类型能否向上转型(强转)关键是看该变量所指向对象与目标类型是否存在继承关系,如果存在则可以强转。

    这里有个容易忽视的点是一个变量的类型不一定就是其所引用对象的真正的类型,因为多态的原因还可能是其亚类型/或是接口类型。

    展开全文
  • java继承强转出现问题

    千次阅读 2018-11-09 17:51:21
    java的继承的时候可能会出现强转错误的问题。 父类的子类强转父类的时候需要让父类的对象指向子类对象。 先来看下代码: package MM; public class extends_problem { public static class parent{ public S...

                                           java继承强转出现问题

    java的继承的时候可能会出现强转错误的问题。

    父类的子类强转父类的时候需要让父类的对象指向子类对象。

    先来看下代码:

    package MM;
    
    public class extends_problem {
    	public static class parent{
    		public String name;
    		public parent(String name) {
    			this.name=name;
    		}
    	}
    	public static class child extends parent{
    		public int age;
    		public child(String name,int age) {
    			super(name);
    			this.age=age;
    		}
    	}
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		parent []p=new parent[3];
    		parent p1=new parent("das");
    		child c = new child("asd", 14);
    		child d=new child("lyc",21);
    		p[0]=c;
    		child c1=(child)p[0];
    	}
    
    }

    如果在最后面加上如下语句会出现报错:

    		child c2=(child)p1;

    父类的变量可以指向子类的引用,这是java允许的。但是父类的对象调用子类的方法(父类没有该方法)是报错的。

    以下是上面代码的总结

    子类的变量不能指向父类的引用。只能通过强转。被强转的父类必须是指向子类的引用,否则在编译的时候将会报错。

    • 只能在继承层次内进行类型转换
    • 在将超类转换为子类之前,应该用instanceof进行检查

     

    展开全文
  • 由于JDK的加载会拿到Object实例,所以要用到强转类型。 加载例子 一般见网上的例子即可,本例使用a.class,定义一个cn.demo.MyDemo,继承于IDemo接口。 public class MyDemo implements IDemo { @Overided ...

    背景

    业务需要在运行时动态加载class文件,并注册到spring bean中。由于JDK的类加载会拿到Object实例,所以要用到强转类型。

    加载例子

    一般见网上的例子即可,本例使用a.class,定义一个cn.demo.MyDemo类,继承于IDemo接口。

    public class MyDemo implements IDemo {
    	@Overided
    	public String show() {
    		System.out.println("YES");
    	}
    }
    

    在Main方法中,强转后使用show方法,无异常。

    public class MyClassLoader extends ClassLoader {
        @Override
        protected Class<?> findClass(String name) {
            String myPath = "file:///D:/a.class";
            System.out.println(myPath);
            byte[] cLassBytes = null;
            Path path = null;
            try {
                path = Paths.get(new URI(myPath));
                cLassBytes = Files.readAllBytes(path);
            } catch (IOException | URISyntaxException e) {
                e.printStackTrace();
            }
            Class clazz = defineClass(name, cLassBytes, 0, cLassBytes.length);
            return clazz;
        }
    	public static void main(String[] args) throws ClassNotFoundException {
            MyClassLoader loader = new MyClassLoader();
            Class<?> aClass = loader.findClass("cn.demo.MyDemo");
            try {
                Object obj = aClass.newInstance();
                IDemo demo = (IDemo) obj;
                demo.show();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    在Spring 的Service层中,却提示ClassCastException。

    ...
    MyClassLoader loader = new MyClassLoader();
    Class<?> aClass = loader.findClass("cn.demo.MyDemo");
    
    Object obj = aClass.newInstance();
    // 此处报错
    IDemo demo = (IDemo) obj;
    
    // 注册到Bean中
    ...
    

    排错过程

    使用instanceof检测是否同一个类

    boolean flag = obj instanceof IDemo //显示false
    

    结果显示Spring下为false,main下为true

    检测是否使用同一个类加载器

    ClassLoader l1 = obj.getClassLoader();
    ClassLoader l2 = IDemo.getClassLoader();
    

    Spring下:

    • l1为org.springframework.boot.devtools.restart.classloader.RestartClassLoader
    • l2为sun.misc.Launcher$AppClassLoader

    Main下:

    • 都为sun.misc.Launcher$AppClassLoader

    好了,总算知道问题在哪了,Spring的热部署惹的祸,把热部署去掉就能强转了。

    要点

    同一个类型判断:

    • 必须包路径及名称一致
    • 必须属于同一类加载器加载出来的,否则也是不同的

    后记

    若在Spring Boot中打包成Jar使用,类加载器会变成LaunchedURLClassLoader,这时更多会导致运行环境中出异常而开发环境无异常。

    这时需要将自定义类加载器继承调整一下:

    public class MyClassLoader extends URLClassLoader {
        public MyClassLoader(URL[] urls, ClassLoader parent) {
            super(urls, parent);
        }
    ...
    

    解释:使用URLClassLoader是因为它属于两种情况下共同的父类,而且借助构造函数传父类加载器,可以委托类加载器进行加载。

    展开全文
  • 在开发的时候,遇到这么一个问题,一个父类数组强转子数组编译是没有问题,但是在运行过程中,就会出现类型转换的错误。然后用这个数组里面的元素直接强转成子对象,运行是成功的。当时就纳闷了,明明可以强转啊...
  • java类型强转,自己不能转换成自己产生背景解决方法 产生背景 使用SpringBoot 集成Quartz框架,项目启动时报错: 2020-08-12 13:49:13.003 ERROR 8512 --- [eduler_Worker-3] org.quartz.core.JobRunShell : Job test...
  • java强转泛型遇到的坑

    千次阅读 2019-09-14 14:14:15
    这句虽然在编译器中没有语法上的错误,可是一运行则爆出下面这样的错误 一开始,复查了十几遍也以为是自己泛型定义错了,甚至也重写了好几次方法,最重点的是即使debug编译器还没走到方法里面就报错。但是不负有心人...
  • Java的所有和接口都是Object类型的。在List的get()方法取出对象数据,必须进行类型强转,才可以赋给某个的对象。如Person person = (Person) personList.get(i);这里的(Person)就是强转了。如果是定义一个Object...
  • springboot 出现两个相同的类强转类型报错 java.lang.ClassCastException今天出现了一个令我感到惊奇的问题是时候打破常规了 今天出现了一个令我感到惊奇的问题 Java 强转类型,相信大家并不陌生,通常来说,强转...
  • java的null类型强转

    2017-03-20 17:08:00
    java中的null值是可以强制转换为任何java类型的,就像(String)null是合法的,但null强转后的是无效对象,其返回值还是为null,但是例如下面这种情况 public class NULL { public static void main(String[]...
  • Java踩坑系列——类型强转(Object[] 转 String[]) 文章目录Java踩坑系列——类型强转(Object[] 转 String[]) 最近开发中遇到了一个bug,就是List的toArray方法,他返回的是Object[]类型,当我们将它转换为...
  • java 对象之间的强转

    千次阅读 2019-02-28 09:06:37
    定义两个 public class Test{ 父类 } public class TestExtend extends Test{ 子类 } 根据java多态,子类继承父类,子类可以强转为父类,说明子类就是父类,但是父类却不是子类,所以父类不能强转为子类 ...
  • <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath();...String basePath = request...[color=#FF0000][b]为什么强转出现500错误[/b][/color]
  • Java中null关键字的强转

    千次阅读 2017-10-19 15:49:57
    null可以强制转化为任何Java类型的对象,(String)null也是合法的,但是强制转化后是无效对象,返回值还是null,  static方法和类名绑定,不借助对象进行访问,所以可以进行输出,如果没有static进行修饰,使用...
  • java异常和错误

    2020-12-17 19:42:35
    都继承自java.lang.Throwable,注意public class Throwable extends Object implements Serializable,这是一个实体。 检查性异常:从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过; ...
  • 一、问题: ... 遇到的问题:传输的对象是一个嵌套的对象,反解的时候会报出类型强转异常 二、解决:  参考网址:【Gson对象转成Java复杂对象出错】  //规则生成 @RequestMapping(va...
  • 实际上,只要符合今天介绍的几个规则,不同类型之间也可以实现强转。 首先看看以下例子: [code="java"] package typeconvert; public class TypeConvertionDemo1 { publi...
  • 精度丢失错误示例 ...import java.math.BigDecimal; /** * 测试(Double强转Int)精度丢失问题 * * @author wangsong * @date 2019年9月21日 */ public class TestDoubleInt { public static void mai...
  • 本文将简要介绍Java中的一些异常和错误简介:Java中的异常或者错误都有一个共同的祖先Throwable(可抛出),它有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量...
  • java (String)强转 和 toString() 的区别

    万次阅读 2017-07-17 14:13:20
    前言:说到toString()和(String), 我相信初学者有很多人在使用toString方法时踩过的坑,本文章介绍toString()和(String)的区别,及如何去避免发生不可预测的错误。 首先,先看一下API文档上Object的方法简介,...
  • java类型提升机制比较常见,但是比较隐蔽,特别是自动强转类型的时候,如果不注意就可能出错。 涉及基本元素的自动提升类型场景有: 不同类型进行四则运算的时候,会自动提升类型到类型最高元素的类型 += 和 -= 会...
  • grade clean assemblePlugin执行后,编译报错ource/r/release/android/support/constraint/R.java:67: 错误: 不兼容的类型: 无法转换为intpublic static final int[] ConstraintLayout_Layout = { null, null, null,...
  • 好了,现在问题开始,我在接收返回值时无法强转成对象,必需将我客户端对象路径放到错误提示时给出的路径中!只有这样才能接收。问题是我这个SERVICE需要给多个客户端。我也不能规定每个客户端都必需按照某一个特定...
  • 错误为:class java.util.Date cannot be cast to class java.sql.Date 看来直接util.Date转换sql.Date是不对的 应该改为如下格式: 运行成功 总结: 日期转换更改正确格式为: 对象名.setDate(第几个占位符,new ...
  • Java中的数组和List集合以及类型强转

    万次阅读 2018-04-19 19:01:29
    java中,集合操作有两种方式...也都知道其实泛型在到字节码层面上时,会被擦除,虽然字节码中还会保留泛型参数(可以利用反射看到),但对真实的的并不产生多大影响。 那么,对于List来说,如果泛型存在继承关...
  • 一、前言 相信大家在日常开发中这三种方法...(String)是标准的类型转换,将Object类型转为String类型,使用(String)强转时,最好使用instanceof做一个类型检查,以判断是否可以进行强转,否则容易抛出ClassCas...
  • 一、ArrayList的定义 ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。 ...
  • 枚举 valueOf 后强转的问题 遇上过的最诡异的问题了。。。 package site.xunyi.jdk.lang; import org.junit.jupiter.api.Test; public class EnumTest { @Test public void testValueOf(){ Week monday = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,233
精华内容 5,693
关键字:

java强转类错误

java 订阅