在Android TextView中进行类型转换

时间:2013-11-25 23:12:49

标签: java android

为什么这行中的类型转换在android

中有效
TextView tv = (TextView) findViewById(R.id.someId);

但在我的情况下会导致错误

public class B extends A{
   void b(){
     System.out.println("from B class");
             }}
public class A {
     public static void main(String[] args) {
      B b =(B) new A();
       b.b();
 }}

如果我没有困惑

findViewById(R.id.someId);

此字符串应返回视图对象,视图是textview的超类。所以我无法理解为什么它在android中起作用。请帮助我理解,对任何回复都会非常感激。

2 个答案:

答案 0 :(得分:3)

TextView tv = (TextView) findViewById(R.id.someId);

如果R.id.someId标识的视图实际上是TextView(或任何其他延伸TextView - and there are quite a few的视图,则此上线广告无效。如果是ImageView,则会得到ClassCastException

返回您的代码段:

public class B extends A { ... }

根据上述定义,B的每个实例也是A的实例。然而,相反的情况并非如此(并且是一个常见错误):A的每个实例都不一定是B的实例。一旦您添加了另一个扩展A的类:

,这将变得更加清晰
public class C extends A { ... }

BC类型的对象是A的实例,但A可以是AB或{{1 }}。并且C的实例永远不会成为B的实例。因此,以下内容无效:

C

您正在创建B b = (B) new A(); 的新实例,但A不是A的实例。正如我们在上面建立的那样,反之亦然。因此,类型转换无效。事实上,由于您正在创建一个新的B,因此它始终只是A的一个实例,仅此而已。

答案 1 :(得分:0)

findViewById方法的签名是返回View但是返回的实际对象不是View,而是从View继承的其中一个类,例如TextView。该对象已经TextView,因此转换正常。

就好像你有一个方法:

public A someMethod() {
    return new B();
}

并使用它

B b = (B) someMethod();