当前位置: 首页 > 面试题库 >

用Java转换的懒类?

朱毅
2023-03-14
问题内容

有人可以启发我为什么我没有得到ClassCastException这个片段吗?我对为什么它不能按我预期的那样非常感兴趣。我现在不在乎这是否是不好的设计。

public class Test {
  static class Parent {
    @Override
    public String toString() { return "parent"; }
  }

  static class ChildA extends Parent {
    @Override
    public String toString() { return "child A"; }
  }

  static class ChildB extends Parent {
    @Override
    public String toString() { return "child B"; }
  }

  public <C extends Parent> C get() {
    return (C) new ChildA();
  }

  public static void main(String[] args) {
    Test test = new Test();

    // should throw ClassCastException...
    System.out.println(test.<ChildB>get());

    // throws ClassCastException...
    System.out.println(test.<ChildB>get().toString());
  }
}

这是Java版本,编译和运行输出:

$ java -version
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
$ javac -Xlint:unchecked Test.java
Test.java:24: warning: [unchecked] unchecked cast
    return (C) new ChildA();
               ^
  required: C
  found:    ChildA
  where C is a type-variable:
    C extends Parent declared in method <C>get()
1 warning
$ java Test
child A
Exception in thread "main" java.lang.ClassCastException: Test$ChildA cannot be cast to Test$ChildB
  at Test.main(Test.java:30)

问题答案:

类型擦除:泛型仅是一种语法功能,编译器将其删除(出于兼容性原因),并
在需要时 用强制转换代替。

在运行时,该方法C get不知道类型C(这就是为什么无法实例化的原因new C())。的调用test.<ChildB>get()实际上是的调用test.getreturn (C) new ChildA()之所以被转换为,return (Object) new ChildA()是因为无边界类型的擦除CParent(其最左边界)。然后,由于println需要使用Objectas参数,因此不需要强制转换。

另一方面,test.<ChildB>get().toString()失败test.<ChildB>get()是因为ChildB调用之前将其强制转换为toString()

注意,类似的调用myPrint(test.<ChildB>get())也会失败。调用时ParentgetChildB完成从return
by 到type的转换myPrint

public static void myPrint(ChildB child) {
  System.out.println(child);
}


 类似资料:
  • 问题内容: 我对用Java转换对象的含义感到困惑。 说你有… 这是怎么回事 变量类型会更改吗,还是变量内的对象会更改?很迷茫。 问题答案: 看一下这个样本:

  • 问题内容: 我想知道是否有人可以告诉我铸造的工作原理?我知道何时应该执行此操作,但并不真正了解它的工作原理。对于原始数据类型,我会部分理解,但是在涉及对象转换时,我不了解其工作方式。 例如,如何突然将类型为Object的对象转换为对象MyType(仅作为示例),然后获取所有方法? 问题答案: 用Java进行转换并不是魔术,而是告诉编译器A类型的Object实际上是更特定的B类型,因此可以访问B本来

  • 问题内容: 我对接口和类实现接口有疑问。 这是我的代码: 我想创建一个这样的实例: 可以,但是如何从接口实例中调用?这是安全的吗? 感谢帮助。 问题答案: 是的,就可以了(如果你改变的声明来实现),并作为参考真的很安全,只要 不 参考的实例。 但是,这通常是个坏主意。使用接口的全部目的是能够与 任何 实现一起使用- 它是将抽象与实现分开。如果你然后将需要一个具体的实现,你还不如让的类型正好与开始。

  • 问题内容: 什么是转换不同的方法来,我知道有一个选项,但想知道是什么其他可用于相同? 注意: 我没有进一步的要求,因此我不能在这个问题上添加更多内容,但是在此时,如果我能知道有哪些不同的方法可用于转换,那将非常棒。 更新: 建议的不同方法是: javax.xml.bind.Marshaller和javax.xml.bind.Unmarshaller XStream的 XMLBean jaxb ca

  • 问题内容: 有谁知道如何使用Java将任何一种视频格式转换为flv,我一直在寻找用于转换视频的Java api,但似乎没有这种方法,但是可能有一种方法可以实现,我的意思是诸如youtube服务之类的功能确实可以转换视频,但是使用Java,我需要一个可以将视频显示为FLv格式但可以任何格式上传的网络应用程序,如果有人做出了类似的事情,请告诉我如何或任何想法, 谢谢。 问题答案: Java中没有人直接