Java中允许向上转换,但是向下转换会产生编译错误.
可以通过添加强制转换来删除编译错误,但无论如何都会在运行时中断.
在这种情况下,为什么Java允许向下转换,如果它不能在运行时执行?
这个概念有什么实际用途吗?
public class demo {
public static void main(String a[]) {
B b = (B) new A(); // compiles with the cast,
// but runtime exception - java.lang.ClassCastException
}
}
class A {
public void draw() {
System.out.println("1");
}
public void draw1() {
System.out.println("2");
}
}
class B extends A {
public void draw() {
System.out.println("3");
}
public void draw2() {
System.out.println("4");
}
}
Run Code Online (Sandbox Code Playgroud) 第一个代码:
List<Integer>[] array = (List<Integer>[]) new Object[size];
Run Code Online (Sandbox Code Playgroud)
它将给出以下异常:
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.util.List; ([Ljava.lang.Object; and [Ljava.util.List; are in module java.base of loader 'bootstrap')
为什么会这样呢?我只是按照有效Java第三版 132页的方法进行操作:
第二码:
E[] array = (E[]) new Object[size];
Run Code Online (Sandbox Code Playgroud)
但是我发现以下代码有效
第三码:
List<Integer>[] array = (List<Integer>[]) new List[size];
Run Code Online (Sandbox Code Playgroud)
我的问题:
例如:为什么以下代码运行良好,但是第一个代码错误?
public class Test<E>{
E[] array;
public Test(){
array = (E[]) new Object[10];
}
public E set(E x){
array[0] = x;
System.out.println(array[0]);
return array[0];
}
public static void …Run Code Online (Sandbox Code Playgroud) 我想将父类的实例传递给其类型是该父类的子类的变量。
有如下两个类:
class Parent{
var aaa:String?
var bbb:String?
init(pa:String?,pb:String?){
self.aaa=pa
self.bbb=pb
}
}
class Child:Parent{
var ccc:String?
}
Run Code Online (Sandbox Code Playgroud)
现在,我这样使用它们:
let p=Parent(a:"1111",b:"22222")
if let c=p as? Child{
print(c)
}
Run Code Online (Sandbox Code Playgroud)
但在任何情况下该变量都是零。
我想得到如下结果:c.aaa="1111" c.bbb="222" c.ccc=nil或其他
我刚刚遇到了一个非常奇怪的行为。我想比较2个使用完全相同的日期d1.equals(d2);,但结果是错误的。
调试时,我发现两个日期的“快速时间”为1531951200000。之后,我将检查更改为d1.getTime() == d2.getTime()并得到了相等的结果。
我还检查equals()的方法,java.util.Date这确实几乎完全一样
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
Run Code Online (Sandbox Code Playgroud)
请注意,这两个对象都是类型java.util.Date这就排除了,有可能是一个区别,即java.util.DateVS java.sql.Date。还要注意,其中一个值是从数据库中读取的,而另一个是从文件中读取的。这两个值都设置为带有java.util.Date字段的同一类的不同实例。
有人对此有解释吗?还是我只是想念一些东西?
让我们说:
class A {
public int fieldA = 0;
}
class B extends A {
public int fieldB = 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想从A创建一个B实例:
A a = new A();
B b = (B) new A();
Run Code Online (Sandbox Code Playgroud)
这给出了classCastException.我可以在B中创建一个带有A实例和复制字段的costructor,但它显然是非实际的:
class B extends A {
public int fieldB = 0;
B (A a){
fieldA = a.fieldA;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
我有下面提到的课程:
public class JsonHistoryList extends ArrayList<JsonHistory> implements Serializable{}
Run Code Online (Sandbox Code Playgroud)
我希望通过意图使用它
timerService.putExtra(TimerService.ACTIVITY_LIST_ARG, activities);
Run Code Online (Sandbox Code Playgroud)
但在我收到它之后(下面的方式)
JsonHistoryList temp = (JsonHistoryList) intent.getSerializableExtra(TimerService.ACTIVITY_LIST_ARG);
Run Code Online (Sandbox Code Playgroud)
在我的服务中它给了我例外:
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.epstim.captime.jsonmodel.JsonHistoryList
Run Code Online (Sandbox Code Playgroud)
我不明白为什么java无法处理该操作.
我已将服务代码更改为:
ArrayList<JsonHistory> temp = (ArrayList<JsonHistory>) intent.getSerializableExtra(TimerService.ACTIVITY_LIST_ARG);
activities.addAll(temp);
Run Code Online (Sandbox Code Playgroud)
它奏效了.
据我所知,不可能将超类的Object转换为子类的Object.这将编译但在运行时它将返回错误.
更具体地说,给定以下层次的类和接口:
.Alpha是Beta和Gamma的超类
.Gamma是Delta和Omega的超级课程
.接口"In"由Beta和Delta实现
在这种情况下,我定义以下代码:
Delta r;
Gamma q;
Run Code Online (Sandbox Code Playgroud)
它是否正确?
r = (Delta) q;
Run Code Online (Sandbox Code Playgroud)
即使Delta是Gamma的子类,我可以将q转换为Delta吗?我认为这是不可能的,我的教科书另有说法.我已经搜索了很多,根据这个我是对的,这是教科书中的一个错误.
我错过了什么吗?