JAVA:与实例引用混淆

时间:2017-04-22 17:44:30

标签: java list interface

我对实例及其实现有一些非常严重的困惑。

let finalizeButton = UIButton()
    finalizeButton.cornerRadius = 5
    finalizeButton.setTitleColor(.white, for: .normal)
    finalizeButton.setTitleColor(UIColor.white.darkerColor(percent: 0.2), for: .highlighted)
    finalizeButton.backgroundColor = .black
    finalizeButton.addTarget(self, action: #selector(finalize(_:)), for: .touchUpInside)
    finalizeButton.setTitle("Buy Now", for: .normal) 
    finalizeButton.titleLabel?.font = UIFont.systemFont(ofSize: 22, weight: UIFontWeightRegular)
    bottomSection.addSubview(finalizeButton)

    constrain(finalizeButton) {
        $0.width == $0.superview!.width * CGFloat(0.8)
        $0.height == CGFloat(54)
        $0.bottom == $0.superview!.bottom - CGFloat(16)
        $0.centerX == $0.superview!.centerX
    }
    self.finalizeButton = finalizeButton

上面的代码是有效的,因为我知道List<String> lines = Files.readAllLines(Paths.get(fileAddress), Charset.defaultCharset()); 是一个接口,但我可以使用它的类型作为参考变量,我也知道RHS实际上返回List<String>ArrayList的实现。另外,List会返回lines.getClass().getName()以确定。

但令人惊讶的是,当我这样做时,

java.util.ArrayList

我收到了错误,

ArrayList<String> lines = Files.readAllLines(Paths.get(fileAddress), Charset.defaultCharset());

这怎么可能?

1 个答案:

答案 0 :(得分:0)

Java编译器“不知道”将从该方法返回哪种类型。

java.util.listinterface,并且列表中包含所有已知的列表接口实现。

这是readAllLines方法的签名 public static List<String> readAllLines(Path path, Charset cs) throws IOException
Files.readAllLines的文档。

编译器只有readAllLines方法将返回List<String>的信息,但它没有任何信息实现它的信息。因为它编译器无法编译代码。