Java: передача аргумента в конструктор копирования

Inside of class ATester
{
   private A<Integer> p1,p2;

    p1 = new B<Integer>();
    p2 = new B<Integer>( p1);

}

public class B<E extends Comparable<? super E>> implements A<E>
{
     public B()   // default constructor
     {
        // skip
     }

     public B(B other)  // copy constructor
     {
        // skip
     }

}

Я хочу определить конструктор копирования, который принимает другой B в качестве аргумента, но когда я передаю p1 в

p2 = new B<Integer>( p1);

при компиляции выдает сообщение об ошибке

msgstr "не найдено подходящего конструктора для B>"

Что я должен изменить или добавить?

3 ответа

Решение

Измените это на

Или позвонить как p2 = new B<Integer>( (B<Integer>)p1);

Потому что то, что вы пытаетесь сделать, это отправить A<Integer> в B в конструкторе. В конечном итоге это

B b = element of type A<Integer>

Что неправильно из-за противоречивости типа аргумента. Либо измените тип аргумента в вас B конструктор в соответствии с проектом или сделать вышеупомянутое

Вы должны бросить свой p1 в B<Integer> перед вызовом конструктора копирования.

    p2 = new B<Integer>( (B<Integer>)p1);

Или вы можете определить другой конструктор, принимающий тип интерфейса, например

    public B(A<E> other)  // copy constructor
    {
         //type cast here and use it
    }

Ваш B уже реализует A, поэтому измените arg конструктора с B на A:

public class B<E extends Comparable<? super E>> implements A<E>
{
     public B()   // default constructor
     {
        // skip
     }

     public B(A other)  // copy constructor
     {
        // skip
     }



}

Тогда вы можете использовать и A, и B в качестве допустимого параметра cons;

    A<Integer> p1, p2;
    B<Integer> c = new B<Integer>();

    p1 = new B<Integer>(c);
    p2 = new B<Integer>( p1);
Другие вопросы по тегам