为什么这行中的类型转换在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中起作用。请帮助我理解,对任何回复都会非常感激。
答案 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 { ... }
B
和C
类型的对象是A
的实例,但A
可以是A
,B
或{{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();