如何在java中使用抽象方法而不定义它?
在android列表界面中 我有如何在java中使用抽象方法而不定义它?,java,android,Java,Android,在android列表界面中 我有 private List<Contact> contacts; 但get是列表接口中定义的抽象方法 那么这怎么可能写呢 完整代码: 公共类ListViewActivity扩展了AppCompatActivity{ @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity\u list
private List<Contact> contacts;
但get是列表接口中定义的抽象方法
那么这怎么可能写呢
完整代码:
公共类ListViewActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u list\u视图);
ListView ListView=(ListView)findViewById(R.id.list);
setAdapter(新联系人适配器(this));
}
类ContactsAdapter扩展了ArrayAdapter{
私人名单联系人;
公共联系人适配器(上下文){
super(上下文-1);
this.contacts=MockDataGenerator.getMockContacts(1000);
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,
@非空视图组(父视图组){
持票人持票人;
if(convertView==null){
convertView=LayoutInflater.from(getContext())
.充气(R.layout.contact_项目,父项,假);
viewHolder=新的viewHolder(转换视图);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
触点=触点。获取(位置);
viewHolder.nameTextView.setText(contact.getName());
viewHolder.mobileTextView.setText(contact.getMobile());
viewHolder.landlineextview.setText(contact.getLandline());
返回视图;
}
@凌驾
public int getCount(){
返回此.contacts.size();
}
类视图持有者{
私有文本视图名称文本视图;
私有文本视图mobileTextView;
私有TextView-landinetextview;
公共视图持有者(@NonNull视图){
this.nameTextView=(TextView)视图
.findViewById(R.id.name\u text\u视图);
this.mobileTextView=(TextView)视图
.findviewbyd(R.id.mobile\u text\u视图);
this.landinetextView=(TextView)视图
.findviewbyd(R.id.landline\u text\u view);
}
}
}
}
模拟触点生成器:
public static List<Contact> getMockContacts(int length) {
ArrayList<Contact> mockContacts = new ArrayList<>();
for (int i = 0; i < length; i++) {
mockContacts.add(getMockContact());
}
return mockContacts;
}
publicstaticlist getMockContacts(int-length){
ArrayList mockContacts=新的ArrayList();
for(int i=0;i
您的联系人
列表已在构造函数中初始化:
public ContactsAdapter(Context context) {
super(context, -1);
this.contacts = MockDataGenerator.getMockContacts(1000);
}
因此,这里我假设您的
MockDataGenerator
正在生成一个包含一千个mock联系人的列表MockDataGenerator。getMockContacts(1000)
正在返回一个扩展list
的具体类型的实例(因此必须为get()
定义一个实现)。调用contacts.get(position)
时,这是一个虚拟方法调用,JVM将使用MockDataGenerator返回的类型提供的实现。getMockContacts(1000)
它返回列表接口的抽象方法,因为接口定义了该方法。但这并不意味着在运行时(当您的程序被执行时),它正是这样执行的。相反,列出联系人
;`引用类导入此确切接口的任何对象。例如,有两种广泛使用的列表实现:ArrayList和LinkedList。它们都实现了列表接口,并提供了自己的方法实现。get(i)是这些方法之一。让我在实践中向你们展示:
public class Example {
private static List<String> stringList = null;
public static void main(String[] args) {
initList();
final String s = stringList.get(0);
}
public static void initList() {
stringList = new ArrayList<>();
stringList.add("OneString");
stringList.add("SecondString");
}
公共类示例{
私有静态列表stringList=null;
公共静态void main(字符串[]args){
initList();
最终字符串s=stringList.get(0);
}
公共静态void initList(){
stringList=新的ArrayList();
stringList.add(“OneString”);
添加(“第二个字符串”);
}
}
这里
stringList.get(0)
还返回抽象方法get。但在运行时,它会调用ArrayList的方法,因为ArrayList是对象的类型,ArrayList会覆盖此方法。您是否向get
传递了一个数字?像联系人。获取(2)
?位置是列表中对象的索引。所有接口方法都是抽象的(在接口上)。但是,如果您在对象上调用方法,那么该对象perforce有一个具体的类,所有抽象方法的定义都继承自超类和实现的接口。调用与对象类关联的方法实现。我的问题是,由于联系人是一个列表,如何使用contacts.get(position)如果我没有实现get method只是为了添加,我相信默认实现是在java 8中添加的。。。。因此,从技术上讲,接口可以提供默认实现。这并不是对您的特定问题的回答,而是通常与问题相关。公共静态列表getMockContacts(int-length){ArrayList mockContacts=new ArrayList();for(int i=0;iList
是一个接口,它定义了对象需要使用的方法,但它不告诉您将使用什么实现。但是,当您调用getMockContacts
时,该实现会创建ArrayList
@raxx的一个实例,因为contacts
有一个实际的实现类ArrayList
,它确实实现了get
。但是getMockContacts()的返回类型是List,但是
public ContactsAdapter(Context context) {
super(context, -1);
this.contacts = MockDataGenerator.getMockContacts(1000);
}
public class Example {
private static List<String> stringList = null;
public static void main(String[] args) {
initList();
final String s = stringList.get(0);
}
public static void initList() {
stringList = new ArrayList<>();
stringList.add("OneString");
stringList.add("SecondString");
}