【问题标题】:jxl api: why writablesheet is an interface?jxl api:为什么 writablesheet 是一个接口?
【发布时间】:2012-01-12 01:22:47
【问题描述】:

我对 Java 还很陌生,请一直坚持下去。 好吧,我知道接口“提供”仅由具体子类实现的抽象方法。希望这是真的(至少)。 所以我在研究一个jxl api的示例代码,编写和读取一个excel文件,我到了这一点:

workbook = Workbook.createWorkbook(new File("/home/me/workspace/files/output.xls"));
WritableSheet sheet = workbook.createSheet("first sheet", 0);

也就是说,工作簿对象是之前实例化的,是一个 WritableWorkbook 对象。 我正在使用 Workbook 提供的静态方法创建工作簿,该方法是 WritableWorkbook 的超类。直到这个,我在那里。 但是,那么,我在第二条指令中做了什么? 工作表是“WritableSheet”,但这是一个接口!看到api,没有实现类。而“WritableSheet”是另一个接口“Sheet”的子接口。两个接口。但是,我认为我无法从接口创建对象。然后,使用 createSheet 方法(由 WritableWorkbook 提供),似乎我正在创建一个 WritableSheet。 然后在示例代码中我到达了这个:

Label lblNome = new Label(0, 1, "Nome:");
sheet.addCell(lblNome);

第一行没问题,我新建一个元素,一个标签(也就是一个文本单元格); 但第二个?再说一遍,addCell 是一个看到 api 的接口方法! while sheet 之前的执行是什么?在我看来是一个界面。 如果接口提供抽象方法,他们使用的是哪种方法?

请你澄清一下?最后代码可以工作,但不清楚这些接口(Sheet 和 WritableSheet)是如何工作的。

谢谢

【问题讨论】:

    标签: java interface methods abstract jxl


    【解决方案1】:

    所有对象都是具体类的实例。也许您在 javadoc 中看不到任何实现类,但有一个。它可能是createSheet 返回的匿名或私有类实例,如下所示:

    public WritableSheet createSheet() {
        return new WritableSheetImpl(...);
    }
    
    private class WritableSheetImpl implements WritableSheet {
        // implementation of all the methods of WritableSheet here
    }
    

    【讨论】:

    • 我从来没有意识到一个方法可以以这种方式返回一个强制转换的对象,很高兴知道:) 谢谢
    • 当返回一个以WritableSheet 为返回类型的WritableSheetImpl 对象时,会进行隐式转换,不是吗? :-/
    • 为什么会有演员表? WritableSheetImpl 实现 WritableSheet。从特定类型到更通用的类型时不需要强制转换。如果我们有 WritableSheet 的实例,并且我们想要返回 WritableSheetImpl 的实例,则需要进行强制转换。
    • 那是一个明确的演员表。在 Java 中,您更普遍地谈论类型转换,当您说 cast 时,您的意思是显式类型转换。所以当你说没有 cast 而你只将显式类型转换称为强制转换时,你就在这里。
    • 好的。你是对的。我刚刚查看了 Java 教程,他们确实使用术语“隐式转换”来指代这段代码的作用。
    【解决方案2】:

    Java 中的接口定义了一个契约,它们是类型!可能有几个类签署了这个合同 - 我们说这些类正在实现接口。

    您可以将签署合同的类创建的任何对象视为该合同的对象。它可以被强制转换为契约 - 我们说您可以将任何对象从实现接口的类强制转换为该接口类型。

    静态工厂方法createSheet() 就是这样做的。它在内部使用实现WritableSheet 并返回它的对象的具体类。由于createSheet() 的返回类型是WritableSheet,它被强制转换为WritableSheet 类型。一定要理解我们没有创建WritableSheet 的对象——我们不能,因为它是一个接口。但是我们可以将实现接口的任何类的对象转换类型WritableSheet

    一个主要优点是createSheet() 内部使用的实现可以静默更改,而不会影响使用它的客户端代码。当createSheet() 切换到实现WritableSheet 的另一个实现时,您无需更改客户端代码中的任何内容!

    您的代码依赖于接口定义的契约,而不是具体的实现。这很好!

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2015-08-02
      • 1970-01-01
      • 2014-09-16
      • 2011-10-06
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多