如果变量已经是那种类型,为什么要将变量重新转换为类型?

Cod*_*ein 3 java casting

我正在研究一些专业编写的代码,并发现了这个片段.(我希望这个片段足以回答我的问题 - 如果不让我知道的话)

...yada yada yada ....

private ITypedElement format(final ITypedElement elementToFormat) {
        try {
            if (elementToFormat instanceof IStreamContentAccessor) {
                final IStreamContentAccessor resNode = (IStreamContentAccessor) elementToFormat;
                final InputStream contentIs = resNode.getContents();
                final String contentsString = fromInputStreamToString(contentIs);
                final Map options = JavaCore.getOptions();
.... etc....
Run Code Online (Sandbox Code Playgroud)

if段仅在elementToFormat是实例的情况下运行IStreamContentAccessor.那么为什么程序在声明之后做出第一个if声明," final IStreamContentAccessor resNode = (IStreamContentAccessor)elementToFormat;"

什么可能是某种类型的东西,它必须已经是一种类型?

Zim*_*oot 5

程序员可能知道它是a IStreamContentAccessor,但没有强制转换,编译器不会知道它是a IStreamContentAccessor,所以它不会让程序员访问特定于IStreamContentAccessor该类的任何字段/方法.

class ClassA {
    Object field1;
}

class ClassB extends ClassA
    Object field2;
}

ClassA obj = new ClassB();
obj.field1;  // This is fine, the compiler knows it's a ClassA
obj.field2;  // This isn't allowed - as far as the compiler knows it's a ClassA, not a ClassB
((ClassB)obj).field2;  // This is allowed - now the compiler knows it's a ClassB
Run Code Online (Sandbox Code Playgroud)