2016-08-16 2 views
-1

Я создал новый класс и конструктор, как это:не удается разрешить конструктор ArrayList

public class Person { 
    String firstName; 
    String lastName; 
    String pass; 

    public Person(){} 

    public Person(String f,String l,String p){ 
    firstName=f; 
    lastName=l; 
    pass=p; 
    } 
} 

Затем я создал объект в MainActivity:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    ArrayList<Person> list = new ArrayList<Person>(); 
    ArrayList<Person> list2 = new ArrayList<Person>("a","b","c"); 
} 

Проблема заключается в том, что у меня есть такое сообщение это:

не удается разрешить конструктор 'ArrayList (java.lang.String, java.lang.String, java.lang.String)'

и в классе Person говорит, что конструктор никогда не используется.

Что я сделал не так?

+0

Вы пытаетесь инициализировать свой список2 с помощью a, b, c? – TWL

+0

Поскольку такого конструктора нет – Andremoniy

+2

«Что я ошибся?», Вы создали класс «Личность», затем создаете 'ArrayList', который содержит' Person', но вместо этого вы передаете 'String'. – vlaz

ответ

0

Вы создаете экземпляр ArrayList, а не Person. Для вашего второго списка, попробуйте следующее:

ArrayList<Person> list2 = new ArrayList<Person>(); 
list2.add(new Person("a","b","c")); 

Вы должны объявить свои Person объекты и add их после создания List.

2

Вы строите СПИСОК лиц. Но вы предоставляете аргументы для создания ЧЕЛОВЕКА.

Вы могли бы написать:

list2 = new ArrayList<>(Arrays.asList(new Person("a","b","c"))); 

или в качестве альтернативы:

list2 = new ArrayList<>(Collections.singletonList(new Person("a","b","c"))); 

В других языках может существовать "неявный" (за обложками) поиском функциональности "соответствия"; так что, когда вы предоставляете аргументы для создания Person, вызывается соответствующий конструктор.

В Java это не работает. И обратите внимание: даже если это сработает; В ArrayList нет есть конструктор, который принимает объекты и добавляет их в список.

Короче говоря: вам нужно использовать другой синтаксис. Вы можете использовать предложения других людей; или если вы предпочитаете «oneliner» (но «более дорогие») решения ... попробуйте сыграть с моими предложениями. И, конечно же: изучите javadoc для функций библиотеки, которые я использую; поскольку они налагают определенные ограничения на возвращенные списки.

И принимать входной сигнал от 4castle: было бы лучше практика не применять тип списка на левой стороне, как:

List<Person> list2 = Arrays.asList<>(new Person("a","b","c")); 

Значение: если возможно, использовать базовые коллекции интерфейсы; а не конкретные классы позади них. Это позволит вам впоследствии изменить фактическую реализацию. Но если вы используете «ArrayList» повсюду, вам нужно изменить каждое место, где вы исправлено этого типа. Поэтому лучше избегать этого, где это возможно!

+0

Пустой '<>' ничего не значит для метода, только для конструкторов. Поэтому 'Arrays.asList' не нуждается в' <> '. – 4castle

+0

У тебя один острый глаз. Еще раз спасибо! – GhostCat

+0

Но: вы можете очень хорошо поместить '<>' на вызовы методов. Просто не имеет смысла пускать их. Вы можете использовать их, чтобы дать подсказку типа, см. Http://stackoverflow.com/questions/36409647/java-type-hints-on-generic-method-calling – GhostCat

0

линия, которая, кажется, как виновника это:

ArrayList<Person> list2 = new ArrayList<Person>("a","b","c"); 

Попробуйте это:

ArrayList<Person> list2 = new ArrayList<Person>(); 
Person p = new Person("a","b","c"); 
list2.add(p) 
0

Вы используете Strings вместо лиц.

Вам нужно сделать что-то вроде этого:

ArrayList<Person> list = new ArrayList<Person>(); 
Person p = new Person (first, last, pass); 
list.add (p); 

Вы также можете попробовать это:

ArrayList<Person> list = new ArrayList<Person>() {{ 
    add(new Person (first1, last1, pass1)); 
    add(new Person (first2, last2, pass2)); 
    add(new Person (first3, last3, pass3)); 
}}; 

Позвольте мне знать, если помог. Если бы не я мог попробовать больше.

0

Всегда используйте документацию java при возникновении таких проблем. Поскольку конструктор жалуется, было бы лучше посмотреть на documentation of the ArrayList constructor.

ArrayList() - Создает пустой список с начальной мощностью в десять.

ArrayList (Collection c) - Создает список, содержащий элементы указанной коллекции, в том порядке, в котором они возвращаются итератором коллекции.

ArrayList (int initialCapacity) - Создает пустой список с указанной начальной мощностью.

Это означает, что вы определенно не можете передать объект Person в конструкторы. Он либо ничего не принимает, коллекция или int. Простым способом создания коллекции, когда у вас есть несколько объектов, является Arrays.asList().

Как уже упоминалось, GhostCat работает над сценарием, о котором вы упомянули. Причина в том, что asList вернет ArrayList, который вам нужен.

List<Person> list = Arrays.asList(new Person("a","b","c"))); 

Но если вы создавали набор, например. вам необходимо будет использовать следующее:

Set<Person> set = new HashSet(Arrays.asList(new Person("a","b","c"))); 

Он жалуется на конструктор Person, который не используется, поскольку он определенно не используется. При использовании конструктора всегда должно следовать ключевое слово «новое». В вашем случае это не так.

Смежные вопросы