如何在不定义的情况下在java中使用抽象方法?

时间:2017-09-06 17:33:18

标签: java android

在android List界面中,

我有

private List<Contact> contacts;

还有,

Contact contact = contacts.get(position);

但是get是List接口中定义的抽象方法。

那怎么可能写呢?

完整代码:

public class ListViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);

        ListView listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(new ContactsAdapter(this));
    }

    class ContactsAdapter extends ArrayAdapter<Contact> {
        private List<Contact> contacts;

        public ContactsAdapter(Context context) {
            super(context, -1);
            this.contacts = MockDataGenerator.getMockContacts(1000);
        }

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView,
                            @NonNull ViewGroup parent) {

            ViewHolder viewHolder;

            if (convertView == null) {
                convertView = LayoutInflater.from(getContext())
                        .inflate(R.layout.contact_item, parent, false);

                viewHolder = new ViewHolder(convertView);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }

            Contact contact = contacts.get(position);

            viewHolder.nameTextView.setText(contact.getName());
            viewHolder.mobileTextView.setText(contact.getMobile());
            viewHolder.landlineTextView.setText(contact.getLandline());

            return convertView;
        }

        @Override
        public int getCount() {
            return this.contacts.size();
        }

        class ViewHolder {
            private TextView nameTextView;
            private TextView mobileTextView;
            private TextView landlineTextView;

            public ViewHolder(@NonNull View view) {
                this.nameTextView = (TextView)view
                        .findViewById(R.id.name_text_view);
                this.mobileTextView = (TextView)view
                        .findViewById(R.id.mobile_text_view);
                this.landlineTextView = (TextView)view
                        .findViewById(R.id.landline_text_view);
            }
        }
    }
}

MockContacts生成器:

public static List<Contact> getMockContacts(int length) {
    ArrayList<Contact> mockContacts = new ArrayList<>();
    for (int i = 0; i < length; i++) {
        mockContacts.add(getMockContact());
    }
    return mockContacts;
}

3 个答案:

答案 0 :(得分:2)

MockDataGenerator.getMockContacts(1000)返回扩展List<T>的具体类型的实例(因此必须为get()定义实现)。当您调用contacts.get(position)时,这是一个虚方法调用,JVM将使用MockDataGenerator.getMockContacts(1000)返回的类型提供的实现。

答案 1 :(得分:0)

您的contact列表在构造函数中初始化:

public ContactsAdapter(Context context) {
    super(context, -1);
    this.contacts = MockDataGenerator.getMockContacts(1000);
}

所以在这里我假设您的MockDataGenerator生成了一千个模拟联系人的列表

答案 2 :(得分:0)

它返回List接口的抽象方法,因为接口定义了方法。但这并不意味着在运行时(执行程序时),它就完全按照这种方法执行。相反,#map { height: 280px; width: 500px; } @media screen and (max-width: 600px) { #map { height: 140px; width: 250px; } } ;`指的是哪个类导入这个确切的接口。例如,有两种广泛使用的List实现:ArrayList和LinkedList。它们都实现了List接口并提供了它们自己的方法实现。 get(i)是这些方法之一。让我告诉你实践:

List<Contact> contacts

}

这里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"); } 也返回抽象方法get。但是在运行时它会调用ArrayList的方法,因为ArrayList是对象的类型,而ArrayList会覆盖此方法。