我已经在.net中进行了很多转换-大多是将通用对象向下转换为更具体的对象,而我知道这是可行的。但是直到现在我在Android中将示例中的一些代码组合在一起,我才开始讲授自己的课程。

我似乎找不到很好的示例来显示强制转换以及与要强制转换的类的代码。基本上,我想精确地了解这种情况下的转换方式,因为我想修改下面的类dbData来包含其他变量和方法,但不确定如何影响下面的onClick方法中的转换。 onClick方法位于包含listView和几个按钮的Activity中。这些按钮可以添加一个listView项目或删除第一个listView项目。删除项目时,它将发送此有问题的演员表dbData =(dbData)lstView.getAdapter()。getItem(0);

dbData是我的类,它是从一个示例派生的。我无法理解的部分是,强制转换似乎已成功地将变量id和dbData填充了强制转换。


它怎么知道这样做?基本问题,但似乎找不到详细的描述。如果dbData只是一个字符串,而getItem(0)仅返回一个字符串,这似乎很明显。但是在这种情况下,它会填充字符串“ dbData”和整数“ id”
我可以从演员表中填充其他变量或对象吗?这个问题是理论上的。意思是,如果我可以获取其他变量,我将如何知道可以获取哪些变量,并且是否有任何特殊的技术来定义dbData中的变量?
是否可以在dbData类中添加其他变量和类而又不弄乱转换,也可以在转换中无意中填充这些变量和类?我如何确定要这样做?


希望我在提出问题时只是想具体了解演员表的工作原理。感谢您的任何帮助!

这是上面提到的演员表的活动代码:

public void onClick(View view) {
    @SuppressWarnings("unchecked")

    ListView lstView = (ListView)findViewById(R.id.lstHolidays);

    ArrayAdapter<dbData> adapter = (ArrayAdapter<dbData>) lstView.getAdapter();
    dbData dbData = null;
    switch (view.getId()) {
        case R.id.add:
            String[] comments = new String[] { "Cool", "Very nice", "Hate it" };
            int nextInt = new Random().nextInt(3);
            // save the new dbData to the database
            dbData = datasource.createDB_Row(comments[nextInt]);
            adapter.add(dbData);
            break;
        case R.id.delete:
            if (lstView.getAdapter().getCount() > 0) {
                dbData = (dbData) lstView.getAdapter().getItem(0);
                datasource.deleteDB_Row(dbData);
                adapter.remove(dbData);
            }
            break;
    }
    adapter.notifyDataSetChanged();
}


这是dbData类:

public class dbData {

    private long id;
    private String dbData;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getDbData() {
        return dbData;
    }

    public void setDbData(String dbData) {
        this.dbData = dbData;
    }

    // Will be used by the ArrayAdapter in the ListView
    @Override
    public String toString() {
        return dbData;
    }

}

最佳答案

您的代码中有两个强制转换。

您正在使用包含dbData对象的通用ArrayAdapter:

ArrayAdapter<dbData> adapter = (ArrayAdapter<dbData>) lstView.getAdapter();


也许是在代码中的某个位置进行了设置,所以无论何时它是ArrayAdapter(或派生类),上面的转换都将起作用。

关于dbData ...您没有将适配器转换为dbData。您正在获取适配器(ArrayAdapter),检索一个项目并将其强制转换为dbData:

dbData = (dbData) lstView.getAdapter().getItem(0);


因此,由于您的ArrayAdapter包含dbData对象,因此转换也将起作用。

此代码等效:

dbData = ((ArrayAdapter<dbData>) lstView.getAdapter()).getItem(0);


-编辑-----------------

因此,是的,您可以修改dbData类以添加(或删除)所需的任意数量的属性或方法,并且不会破坏代码。

09-27 05:54