java - 为什么 Java 让你强制转换为集合?

标签 java collections interface casting

我有一个简单的 foo 类,我可以在没有任何编译器的情况下转换为集合接口(interface)(MapList)错误。 请注意,Foo 类不实现任何接口(interface)或扩展任何其他类。

public class Foo {

    public List<String> getCollectionCast() {
        return (List<String>) this;    // No compiler error
    }

    public Map<String, String> getCollection2Cast() {
        return (Map<String, String>) this;    // No compiler error
    }

    public Other getCast() {
        return (Other)this;     // Incompatible types. Cannot cast Foo to Other
    }

    public  static class Other {
        // Just for casting demo
    }

}

当我尝试将 Foo 类强制转换为集合时,为什么 Java 编译器不返回 不兼容类型错误

Foo 没有实现 Collection。我预计会出现不兼容的类型错误,因为鉴于当前的 Foo 类签名,这不能是 Collection

最佳答案

这不是因为它们是集合类,而是因为它们是接口(interface)Foo没有实现它们,但它的子类可以。所以这不是编译时错误,因为这些方法可能对子类有效。在运行时,如果 this不是实现这些接口(interface)的类,自然是运行时错误。

如果您更改 List<String>ArrayList<String> ,你也会得到一个编译器时错误,因为 Foo子类可以实现 List ,但不能扩展 ArrayList (因为 Foo 没有)。同样,如果您制作 Foo final , 编译器会给你一个错误的接口(interface)转换,因为它知道它们永远不会是真的(因为 Foo 不能有子类,并且不实现这些接口(interface))。

关于java - 为什么 Java 让你强制转换为集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52698154/

相关文章:

VB6 集合删除不会触发 Class_Terminate

java.lang.AbstractMethodError - 使用 ANT 内置 jar 时

java - 包装第三方接口(interface)以避免依赖

c# - 在 C# 中将已实现的接口(interface)指定为属性

外部共享资源(智能卡)的 Java 并发模式

java - 不可见的对象,因为重绘方法 - Java Swing

java - 从前缀表示法构建二叉表达式树?

java - 随机选择一组 double

java - 在java中检查4个Arraylists不包含相同值的最简单方法

java - 有向加权图的邻接表