4
import java.util.Collection;


public class Test
{
    public static void main(String[] args)
    {
        Collection c = null;
        Test s = null;

        s = (Test) c;
    }
}

在上面的代码示例中,我将一个集合对象转换为一个 Test 对象。(忽略空指针)。Test与 Collection没有任何关系,但该程序将通过所有编译时检查。

我想知道这是为什么。我的假设是接口被忽略是因为它们太复杂了。它们没有通用的超类型,每个类都可以实现多个接口,所以类/接口层次结构太复杂而无法有效搜索?

除了这个原因,我很困惑。有人知道吗?!

4

3 回答 3

8

“非决赛”是这里的关键词。你可能有另一门课

public class Test2 extends Test implements Collection

其实例最终将被分配以s使演员表完全合法。

于 2009-08-05T18:54:43.750 回答
3

因为一个子类Test也可能是一个子类型Collection!语言规范设计得有点灵活,允许可以在运行时验证的强制转换。

于 2009-08-05T18:55:00.240 回答
0

我们可以从不同的角度来看待它:任何非 final 类都可以转换为任何接口

import java.util.function.Predicate;

public class Test {
    public static void main(String[] args) {
        Predicate check;

        try {
            /*It's ok to cast to ANY interface because the Base class is not final.
              Java compiler allows it because some class may extend it 
              and implement the predicate interface. 
              So java compiler can check it only at runtime time not compile time.             
            */
            check = (Predicate)(new Base());

            /*
             Java compiler doesn’t allow it because the BaseFinal is final.
             And it means that no one can extend it and implement interface Predicate. 
             So java compiler can check it at compile time.
            */
            //check = (Predicate)(new BaseFinal()); 
        } catch (ClassCastException e) {
            System.out.println("Class Cast Exception");
        }
        check = (Predicate)(Base)(new Child());
    }    
}
final class BaseFinal {};

class Base {}

class Child extends Base implements Predicate {
    public boolean test(Object t) { return true; }
}
于 2018-11-15T19:18:44.543 回答