在泛型集合上克隆

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的句子都可以做同样的事情。没有编译错误。