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

将已知类型的引用强制转换为类型层次结构外部的接口

酆耀
2023-03-14
问题内容

假设您有一个像这样的干净班级:

public class A {
    // Stuff
}

和这样的接口:

public interface G {
    // Stuff
}

为什么我可以这样做:

A a = new A();
((G) a) // No errors thrown

我不明白为什么当彼此无关时,应该可以从类A转换为接口G。有人可以向我解释一下吗?

跟进。如果我进行以下操作:

public class C implements G {
    // Stuff
}

这不会编译:

((C) a)

实现接口的类与仅实现接口的类有什么区别?

编辑:我得到一个编译器错误说:

无法从A投射到C


问题答案:

强制转换意味着您比编译器更了解有效内容。您正在告诉编译器关闭并按照您的指导进行操作。在某些情况下,编译器可以告诉您强制类型转换无效,但是很容易愚弄。

大多数转换通常是从Object到其他对象的,例如从非通用集合中获取对象或使用PortableRemoteObject.narrow获取远程对象时。这些强制类型转换始终会进行编译,因为强制类型转换(只要是对象而不是原始类型)始终是对象的有效子类。

参考类型转换(5.5.1)部分中的Java语言规范中有一些转换规则。如果编译器可以确定这些类之间没有关系(编译器可以告诉这些类是不同的,并且它们都不是另一个的子类),则它将拒绝强制类型转换。

添加的示例很有趣,它失败了,因为编译器具有足够的信息来指示强制类型转换无效。如果将代码更改为:

    A a = new A();
    G g = (G)a;
    Object o = a;
    C c = (C)o;

然后它再次编译正常(即使它同样是错误的)。



 类似资料:
  • 强制类型转换 隐式类型转换:隐式类型转换又称为自动类型转换,隐式类型转换可分为三种:算术转换、赋值转换和输出转换。 显式类型转换:显式类型转换又称为强制类型转换,指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,这种类型转换可能会造成数据的精度丢失。 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则

  • 问题内容: 让我们假设下表(例如,几个内部join语句的结果): 例如,您可以从以下语句中获取: 现在,如果我想将t1.column_1和t2.column_2总结如下 结果显示如下: 我的问题基本上是:有没有一种方法可以将NULL类型转换为0以便进行一些数学运算? 我曾尝试和,而是保持一个。 问题答案: 使用的列值转换到零。或者,COALESCE函数将执行相同的操作,除了(1)符合ANSI标准,

  • 问题内容: 我试图将浮点数转换为php中的int值: 我可以使用ceil使其工作,但是有人可以向我解释吗? 问题答案: 这是因为以10为底的有限表示形式的数字在PHP使用的浮点表示形式中可能具有也可能没有确切的表示形式。 看到 由于总是将数字四舍五入,因此制图表达中的一个小错误使它可以将其四舍五入为一个原本希望的数字。 考虑改为使用。

  • 本文向大家介绍C#中的自动类型转换和强制类型转换,包括了C#中的自动类型转换和强制类型转换的使用技巧和注意事项,需要的朋友参考一下 前面已经认识了不同的数据类型,你们有没有尝试过让不同的数据类型进行运算呢? 运行结果是:1 我们把一个整型的变量赋值给了一个浮点型的变量,可以正常的输出,如果我们把一个浮点型的变量赋值给一个整型的变量呢? 这样就会报错。 为什么呢?因为我们之前说过,变量就像一个容器,

  • Go 语言是一种强类型语言,而且没有隐式转换。也就是说运算符左右的变量类型必须一致,若不一致就会报错。为了使用户更加的容易使用,所以 Go 语言提供了各个类型之间强制类型转换的内置方法。 1. 整型和浮点型互相转换 整型和浮点型变量之间的相互转换相对容易,只需使用强制类型转换标志 type(variable)就好了。需要注意的是,当高精度向低精度类型转换的时候,会失真。即浮点型向整型转换的时候会失

  • 指针变量数据类型的强制转换 必须显式强制类型转换,不允许隐式类型转换 指向空间的强制类型转换,本质上就是普通变量的强制类型转换 int a = 10; float b = 3.14; int *pa = &a; float *pb = &b; *pa = (int)*pb; // 等价于 a = (int)b; 指针本身强制类型转换,改变的是对其指向空间的引用方式(空间大小和存储结构) int