在一组泛型上进行克隆

时间:2015-09-03 11:15:59

标签: java generics inheritance wildcard

我试图研究Java中深拷贝和浅拷贝之间的区别。我创建了一个示例,其中我使用通用类OrganizedGroup来管理Enterprizes,音乐组和其他人。然后,我创建了一个包含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)但是它给出了以下编译错误:

  

歌手不能转换为CAP#1,其中CAP#1是新鲜的   类型变量:CAP#1从捕获中扩展Leader?延伸领袖

我需要回答来解决这个问题,而不是编译错误的解释,更重要的是概念上的错误,应该改变什么以及为什么。

请不要专注于糟糕的设计问题我实际上做了不同的实现(OrganizedGroup是抽象的)但我需要用泛型来解决这个问题。

1 个答案:

答案 0 :(得分:0)

没有必要写:

OrganizedGroup< ? extends Leader> t = go.get(0);

相反,我写道:

OrganizedGroup t = go.get(0)

同样可以在所有主要句子中完成。没有编译错误。