在泛型集合上克隆
Making clone on a collection of generics
我正在研究Java中深拷贝和浅拷贝的区别。我创建了一个示例,其中我使用通用 class OrganizedGroup 来管理 Enterprizes、Music groups 和其他。然后,我创建了一个容器,其中包含类型为 OrganizedGroup 的不同组。
import java.util.ArrayList;
interface Leader {
public void command();
}
class Singer implements Leader {
@Override
public void command() {
System.out.println("I'm a singer");
}
}
class Boss implements Leader {
@Override
public void command() {
System.out.println("I'm a boss");
}
}
class OrganizedGroup<T extends Leader> {
private T mandador;
public OrganizedGroup(T m) {
mandador = m;
}
public void posturaOficial() {
mandador.command();
}
public void setLeader(T m){
mandador = m;
}
}
class MusicGroup extends OrganizedGroup<Singer> {
public MusicGroup(Singer c) {
super(c);
}
public void playMusica() {
System.out.println("Playing music....");
}
}
class Enterprize extends OrganizedGroup<Boss> {
public Enterprize(Boss j) {
super(j);
}
public void makeDeal() {
System.out.println("Making a deal....");
}
}
public class Pruebas {
public static void main(String[] args) {
ArrayList<OrganizedGroup<? extends Leader>> go = new ArrayList();
OrganizedGroup<? extends Leader> g = new MusicGroup(new Singer());
go.add(g);
g = new Enterprize(new Boss());
go.add(g);
for (OrganizedGroup j : go) {
j.posturaOficial();
}
OrganizedGroup< ? extends Leader> t = go.get(0);
t.setLeader(new Singer()); //compile error
}
}
在最后一行我尝试修改第一组的领导者(我需要这样做才能看到浅拷贝和深拷贝之间的区别(比如我克隆进入 go2))但是它给出了以下编译错误:
Singer cannot be converted to CAP#1 where CAP#1 is a fresh
type-variable: CAP#1 extends Leader from capture of ? extends Leader
我需要解决这个问题的答案,不是对编译错误的解释,而是更重要的是概念上的错误、应该更改的内容以及原因。
请不要关注糟糕的设计问题我实际上对此做了不同的实现(OrganizedGroup 是抽象的)但我需要解决这个问题才能练习泛型。
不需要写:
OrganizedGroup< ? extends Leader> t = go.get(0);
相反,我只写了:
OrganizedGroup t = go.get(0)
所有main的句子都可以做同样的事情。没有编译错误。
我正在研究Java中深拷贝和浅拷贝的区别。我创建了一个示例,其中我使用通用 class OrganizedGroup 来管理 Enterprizes、Music groups 和其他。然后,我创建了一个容器,其中包含类型为 OrganizedGroup 的不同组。
import java.util.ArrayList;
interface Leader {
public void command();
}
class Singer implements Leader {
@Override
public void command() {
System.out.println("I'm a singer");
}
}
class Boss implements Leader {
@Override
public void command() {
System.out.println("I'm a boss");
}
}
class OrganizedGroup<T extends Leader> {
private T mandador;
public OrganizedGroup(T m) {
mandador = m;
}
public void posturaOficial() {
mandador.command();
}
public void setLeader(T m){
mandador = m;
}
}
class MusicGroup extends OrganizedGroup<Singer> {
public MusicGroup(Singer c) {
super(c);
}
public void playMusica() {
System.out.println("Playing music....");
}
}
class Enterprize extends OrganizedGroup<Boss> {
public Enterprize(Boss j) {
super(j);
}
public void makeDeal() {
System.out.println("Making a deal....");
}
}
public class Pruebas {
public static void main(String[] args) {
ArrayList<OrganizedGroup<? extends Leader>> go = new ArrayList();
OrganizedGroup<? extends Leader> g = new MusicGroup(new Singer());
go.add(g);
g = new Enterprize(new Boss());
go.add(g);
for (OrganizedGroup j : go) {
j.posturaOficial();
}
OrganizedGroup< ? extends Leader> t = go.get(0);
t.setLeader(new Singer()); //compile error
}
}
在最后一行我尝试修改第一组的领导者(我需要这样做才能看到浅拷贝和深拷贝之间的区别(比如我克隆进入 go2))但是它给出了以下编译错误:
Singer cannot be converted to CAP#1 where CAP#1 is a fresh type-variable: CAP#1 extends Leader from capture of ? extends Leader
我需要解决这个问题的答案,不是对编译错误的解释,而是更重要的是概念上的错误、应该更改的内容以及原因。
请不要关注糟糕的设计问题我实际上对此做了不同的实现(OrganizedGroup 是抽象的)但我需要解决这个问题才能练习泛型。
不需要写:
OrganizedGroup< ? extends Leader> t = go.get(0);
相反,我只写了:
OrganizedGroup t = go.get(0)
所有main的句子都可以做同样的事情。没有编译错误。