gpt4 book ai didi

java - 铸件分析

转载 作者:太空狗 更新时间:2023-10-29 13:11:50 25 4
gpt4 key购买 nike

我是 Java 新手,最近我开始思考以下 Android 示例代码:

TextView txt = (TextView) findViewById(R.id.activity_display_message);

TextViewView 类的子类。 findViewById 返回一个 View 对象。

我想了解当返回的对象实际上必须是 TextView 时,我们如何以及为什么需要将返回的 View 显式转换为 TextView ,否则转换将抛出转换异常。

所以,这是我尝试使用此模型代码模拟幕后发生的事情:

class View{}
class TextView extends View{}

public class A{

// simple hard coded check of the ID
public static View findViewById(int id){

if (id == 1){
return new View();
}
else{
return new TextView();
//return ((View)new TextView()); // This also works
}

}


public static void main(String[] args){

TextView txt = (TextView)findViewById(2); // Works fine
//TextView txt2 = findViewById(2); INCOMPATIBLE TYPES ERROR because the returned type is View
View v = findViewById(2); // Works fine

View view = new View();
//TextView test = (TextView) view; // cast error

View view2 = new TextView();
TextView test2 = (TextView) view2; // Works OK


}
}

结论:

事实证明,findViewById 实际上会转换为 View 任何返回的元素。我猜是因为该方法定义的返回值是View,Java自动将结果转换为View

如果我做对了,请告诉我。

最佳答案

正如您在问题中所描述的,findViewById(R.id.activity_display_message); 返回一个 View 对象,在这种情况下,程序员知道这个特定的 View 实际上是一个 TextView 对象,但是 findViewById 只 promise 返回一个 View,或者任何类的实例从 View 派生,因为任何从 View 派生的类仍然是一个 View,它只是可能有更具体的可用细节。

findViewById 保证返回的是 View 或扩展 View 的内容。如果要将返回的对象视为 View 的特定子类,则需要将 findViewById 返回的对象转换为该子类。

从你的例子来看,
查看view = new View();//这是一个 View ,它不是一个 TextView
查看 textView = new TextView();//TextView 是一个 View,但它也有 TextView 的东西……
//TextView test = (TextView) view;//转换错误

关于java - 铸件分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39665431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com