gpt4 book ai didi

java - 从 getAdapter 到我的泛型类的转换如何进行

转载 作者:行者123 更新时间:2023-12-01 11:55:33 25 4
gpt4 key购买 nike

我在 .net 中做了很多转换 - 主要是从通用对象向下转换为更具体的对象,我知道这会起作用。但我从来没有转换为我自己的类,直到现在我在 Android 中从示例中整理了一些代码。

我似乎找不到很好的例子来展示伴随着被转换的类的代码的转换。基本上,我试图准确理解在这种情况下转换是如何工作的,因为我想修改下面名为 dbData 的类以包含其他变量和方法,但不确定它将如何影响下面的 onClick 方法中的转换。 onClick 方法位于包含 listView 和几个按钮的 Activity 中。这些按钮可以添加 ListView 项目或删除第一个 ListView 项目。删除项目时,它会发送有问题的转换 dbData = (dbData) lstView.getAdapter().getItem(0);

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

  1. 它怎么知道要这样做?基本问题,但似乎找不到详细说明。如果 dbData 只是一个字符串,并且 getItem(0) 仅返回一个字符串,那么这似乎是显而易见的。但在本例中,它填充字符串“dbData”和整数“id”

  2. 我可以从强制转换中填充其他变量或对象吗?这个问题是理论上的;意思是,如果我可以获取其他变量,我怎么知道我可以获取哪些变量,以及是否有任何特殊技术可以在 dbData 中定义变量?

  3. 我可以将其他变量和类添加到 dbData 类中,而不会弄乱强制转换,或者不会无意中将这些变量填充到强制转换中吗?我如何确定要这样做?

希望我的问题能够体现出我只是想具体了解 Actor 阵容是如何运作的。感谢您的帮助!

这是带有上述类型转换的 Activity 代码:

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 类来添加(或删除)所需数量的属性或方法,并且不会破坏代码。

关于java - 从 getAdapter 到我的泛型类的转换如何进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28469987/

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