当前位置: 首页 > 知识库问答 >
问题:

为什么我需要强制转换这个方法Java[duplicate]

祝锐
2023-03-14

我现在正在学习遗传和多态性,除此之外,我也理解它。为什么我需要投三个。setY()不应该已经可以访问它了,因为我正在创建一个从G类继承的H对象。

第8行是语法错误。

public class WS2
{
    public static void main(String[] args)
    {
        G three = new H();
        System.out.println(three);
        three.setX(8);
        three.setY(21); // Syntax Error -> ((H) three).setY()
        System.out.println(three);
    }
}

class G
{
    private int x;
    
    public G()
    {
        x = 3;
    }
    
    public void setX(int val)
    {
        x = val;
    }
    
    public String toString()
    {
        return "" + x;
    }
}

class H extends G
{
    private int y;
    
    public H()
    {
        y = 4;
    }
    
    public void setY(int val)
    {
        y = val;
    }
    
    public String toString()
    {
        return "" + y + " " + super.toString();
    }
}

共有1个答案

曹涵润
2023-03-14

在编译时,three被认为是对aG的引用。三个的类型并不反映被引用对象实际上可能是一个H。

AG没有方法setY,因此不能在引用上调用setY。

您可以强制运行时检查引用的G是否真的是H;如果检查成功,您可以调用setY。如果检查失败,您将获得异常。这就是您对强制转换所做的。

你可能会反对“很明显”,在这个例子中的对象实际上是一个H,在人类读者看来确实如此。然而,在其他情况下,这并不是那么简单——语言规则迎合了一般情况。

此外,如果要将其视为H,为什么要声明三个作为对G的引用?将其声明为H。大多数其他需要G的上下文都会接受它。这一切都可以归结为程序员的意图(我认为这只是一个探索语言的示例,所以没有什么可以继续说什么是“正确的”)。

 类似资料:
  • 我为JavaFX TableColumn创建了一个扩展函数,使得在没有重复样板的情况下实现cellFactory更加简洁。扩展函数定义如下: 为了格式化TableCell,我只需要定义TableCell中应该发生什么。当当前单元格有非空项可用时更新项。例如,要格式化LocalDateTime,我现在可以编写: 然后我继续定义另一个扩展来执行此操作,因此我可以编写: 此函数使用第一个函数,如下所示:

  • 问题内容: 我不知道您是否认为这是一个重要问题,但我想知道。float是一个浮点数(4个字节)。double是浮点数(8个字节)。为什么我们定义双重假名铸造: 但是我们需要使用浮点数进行转换: 要么 先感谢您。 问题答案: 如果浮点文字以字母或结束,则其类型为float 。否则,其类型为,并且可以选择以字母或结尾。 浮点类型(和)也可以使用E或e(对于科学记数法),或(32位浮点文字)和或(64位

  • 问题内容: 我正在使用Java 1.6.0_25。 我定义了一个注释: 后来当我使用getAnnotation时: 编译器和IDE同意我必须强制转换结果,但是getAnnotation在Java 1.5文档中声明为: 由于Resource.class是Class类型,在我看来,这意味着cls.getAnnotation(Resource.class)应该返回Resource类型,并且我需要进行强制

  • 问题内容: 直到今天,我还以为例如: 只是以下方面的捷径: 但是,如果我们尝试这样做: 然后;将不会编译,但;会编译良好。 这是否意味着实际上;是类似这样的捷径 ? 问题答案: 与这些问题一样,JLS保留了答案。在这种情况下,第1.5.26.2节“复合赋值运算符”。摘录: 形式的复合赋值表达式等效于,其中T是的类型,不同之处在于该表达式E1仅被评估一次。 §15.26.2中引用的示例 以下代码正确

  • 问题内容: 我有一个简单的类,并且可以强制转换为集合接口(或),而不会出现任何编译器错误。请注意,该类不实现任何接口或扩展任何其他类。 当我尝试将类转换为集合时,为什么Java编译器不返回 不兼容类型错误? 没有实现。我预计会出现不兼容的类型错误,因为给定当前的类签名,所以不能是。 问题答案: 不是因为它们是集合类,而是因为它们是 接口 。没有实现它们,但是可以实现它的子类。因此,这不是编译时错误

  • 问题内容: 我最近在Android Studio中将我的android SDK和构建工具更新为API 26,当我执行以下操作时,我直接注意到Android Studio将我的视图演员标记为“冗余”: 经过一些研究,我发现自SDK 26起,使用Java 8功能来返回相同的对象类型,但是我想知道的是,删除所有强制类型转换是否完全安全。这会在Android 26之前的版本上引起任何问题吗?有关此方面的更