为什么将扩展的ImageView投射到ImageView?

| 我在名为DialButton2的类中扩展了ImageView类(不必担心该类的名称,它无关紧要)。 DialButton2类所做的所有事情都是显示位于drawable文件夹中的任意图像。
package com.com.com;

import android.content.Context;
import android.widget.ImageView;
import android.util.AttributeSet;

public class DialButton2 extends ImageView{

    public DialButton2(Context context) {
        super(context);
        this.setImageResource(R.drawable.dialpad);
    }

    public DialButton2(Context context, AttributeSet attrs){
        super(context, attrs);
        this.setImageResource(R.drawable.dialpad);
    }

}
在我的应用程序中主要活动的XML文件中,我指定应显示DialButton2对象。我给它id \“ button1 \”。
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<TableLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"
    android:layout_width=\"fill_parent\"
    android:layout_height=\"fill_parent\"
    android:stretchColumns=\"1\"
    >
   <TableRow
    android:layout_weight=\"1\">
         <DialButton
        android:id=\"@+id/button1\"
        android:src=\"@drawable/dialpad\"
        android:layout_weight=\"1\"
        />
不用担心XML文件的其余部分,它无关紧要。 我的问题是,当我尝试实例化代码中对按钮的引用时,eclipse告诉我必须将其强制转换为ImageView。为什么是这样?
package com.com.com;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;

public class Android3 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.maintable);

        /*
         * The instantiating below gives an error saying I have to cast to ImageView.
         */

        DialButton2 button1 = findViewById(R.id.button1);
    }
}
    
已邀请:
        您必须强制转换为DialButton2
    DialButton2 button1 = (DialButton2) findViewById(R.id.button1);
findViewById()返回一个View,必须将其强制转换才能用作DialButton2。     
        您必须强制转换,因为
getViewById(..)
返回一个
View
对象。从父类(
View
)转到子类(
ImageView
/
DialButton2
)时,需要强制转换。您可以在此处查看方法的详细信息。     
        无论您是否获得
DialButton2
都与天气无关,因为无论您使用findViewById(int)尝试“查找”哪种视图,都必须将其强制转换为正在初始化的同一类。     

要回复问题请先登录注册