使用铸造接口类型

时间:2015-09-12 07:02:32

标签: java interface casting

interface I {
    int element = 10;
}
class A implements I
{
    int element = 2;
    public static void main (String[] args) throws java.lang.Exception
    {
        A a = new A();
        System.out.println(a.element);
        I i = (I)a;
        System.out.println(a.element + " " + i.element);
    }
}

输出:

2

2 10

即使我将A类型的对象转换为IelementI的值也不会改变。

如果I是一个类A extends I,那么我可以更改element in A的值并将其转换为I,以便i.element修改后的值(在这种情况下,A没有element成员

在这种情况下,铸造的概念是否存在? (类对象强制转换为接口类型)

2 个答案:

答案 0 :(得分:4)

  

即使我将类型A的对象转换为I,我的元素值也不会改变。

I i = (I)a;

该行显示指向类型I的实例。这意味着,您正在访问类型I中的变量并告诉它执行类a中的方法。

多态性严格用于方法。变量没有多态性。

以下是示例:

public interface TestInterface {

    int testvarInterface = 0;

}


public class TestParent {

    int testvarFromParent = 0;

}



    public class TestClass extends TestParent implements TestInterface {

        public static void main(String[] args) {
            TestClass s = new TestClass();
            System.out.println(s.testvarInterface);
            TestInterface in = (TestInterface) s;
            in.testvarInterface = 15; // ERROR: The final field
                                        // TestInterface.testvar
            // cannot be
            // assigned
            System.out.println(s.testvarFromParent); // Points to LHS
            TestParent parent = (TestParent) s;
            parent.testvarFromParent = 20;
            System.out.println(parent.testvarFromParent);

        }

    }

毕竟你必须记住变量指向LHS(天真,仍然是),在你的界面情况下,因为它是公共的,static final你不能修改它

答案 1 :(得分:0)

在实现类时,不能覆盖I.element的值,因为接口中定义的变量是静态final。作为静态,它们不是实例变量。最后他们不能被覆盖。

因此当您使用类型A的引用时,A.element正在隐藏I.element。但是当您将A实例强制转换为其接口类型I时,它不会隐藏。