本帖最后由 MarkZar 于 2012-02-11 22:18:37 编辑

解决方案 »

  1.   

    好像正确的顺序是先调用方法后强转。楼主研究的很仔细,我不是很清楚,但是(Editable)super这里面()是不是个运算符,就算是个运算符,也只是先计算括号里面的内容,()应该不会影响后面super的运算。()和super之间是不是也是一种运算关系?
      

  2.   

    先计算后面的,再转换成Editable
      

  3.   

    稍微看了下源码,希望对你有帮助。
    即使()和 . 具有相同优先级,你看这个(Editable) super.getText()的运算顺序,()只作用在Editable上,然后super.getText(),如果你觉得是将super转为Editable那么应该是((Editable)super)。因为super后面有个 . 运算,这个和()有相同优先级,那么就应该()和 . 同时运算,那么就是super.getText()然后再强制转换。不知道这个有没有说清楚。
    另外从代码上看,super.getText()是调用的TextView的getText()方法。而TextView的getText()方法返回的是一个CharSequence。再看Editable的源码,它继承了CharSequence。根据多态的性质,就可以将CharSequence转换为
    Editable。
    如果有用请给分,谢谢。
      

  4.   


    十分感谢!终于遇到高手啦,困扰了我好几天了,如果有用一定给分!而且弄懂了还要再加分!我现在明白了是要先处理后面的super.getText(),然后将返回的CharSequence对象进行强制转换,只不过有一点我还是不太懂,按照我的想法,super.getText()返回的应该是一个实现了CharSequence接口的类的实例吧?然后把这个实例强制转换为Editable接口,是这样吗?我做了个小实验:
    interface A { }interface B extends A{ }class Implement_A implements A { }public class Src {

    public static void main(String args[]) {
    A a = new Implement_A();
    B b = (B)a;
    }

    }
    这里的接口A就相当于CharSequence,接口B就相当于Editable,B继承A,另外有一个类Implement_A实现了接口A,之后我在主函数中创建了接口A的对象a,并将其实例化(new Implement_A()),这个对象a就相当于前面Android源代码中super.getText()返回的CharSequence对象,然后我将这个对象a强制转换成接口B(就相当于Android源代码中强制转换为Editable),然后运行,出错,ClassCastException,也就是说好像不能这么强制转换,我感觉很奇怪,我这里的测试代码跟Android源代码中有什么区别吗
      

  5.   

    你的这个问题问到了java的精髓了。泛型,多态...
    简单说下。你写的这个和Android源码里面的那个还是有区别的。你不能直接new一个接口的对象,必须实现接口的所有方法。所以你这个不是转型的错误。Android里面的那个getText()方法返回的是一个CharSequence,但这个是经过向上转型的。
      

  6.   

    还是没搞懂,你的意思是我应该在接口里面写一个方法吗,像这样?
    MainPackage;interface A { 
    public void a();
    }interface B extends A{
    public void b();
    }class Implement_A implements A { 
    public void a() {
    System.out.println("test");
    }
    }public class Src {

    public static void main(String args[]) {
    A a = new Implement_A();
    B b = (B)a;
    }

    }
    这样也是ClassCastException,你说“是经过向上转型的”是什么意思?Android源代码中不是new一个接口对象的吗?那你觉得Android源代码里面大概是怎么实现的?可以给个例子吗?十分感谢!
      

  7.   


    interface A { 
        public void a();
    }interface B extends A{
        public void b();
    }class Implement_A implements B { 
        public void a() {
            System.out.println("test a");
        }
         public void b(){
             System.out.println("test b");
        };
    }public class Src {
        
        public static void main(String args[]) {
            A a = new Implement_A();
            B b = (B)a; // 现在可以随变转了
        }
        
    }应该是这样的,向上转型就是将子类转为父类型,调用它的方法时是调用的子类实现。
    你写的Implement_A没有实现B,跟B没毛关系,所以不能转。建议看下上下转型,多态,继承,接口,实现等内容
      

  8.   

    十分感谢!也就是说在Implement_A中增加一个函数b()就行了?我试过了,还是不行啊,还是ClassCastException