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);
编译时,它会给我错误信息
“没有为B&lt; A&lt; Integer&gt;&gt;找到合适的构造函数”
我应该更改或添加什么?
答案 0 :(得分:2)
在调用复制构造函数之前,您需要将p1
强制转换为B<Integer>
。
p2 = new B<Integer>( (B<Integer>)p1);
或者您可以定义另一个接受接口类型的构造函数,例如
public B(A<E> other) // copy constructor
{
//type cast here and use it
}
答案 1 :(得分:1)
将其更改为
或致电p2 = new B<Integer>( (B<Integer>)p1);
因为您要做的是将A<Integer>
发送到构造函数中的B
。
最终它是
B b = element of type A<Integer>
由于参数类型的反方差,这是错误的。根据设计更改B
构造函数中的参数类型,或执行上面提到的
答案 2 :(得分:0)
你的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);