Java 在泛型集合上进行克隆

Java 在泛型集合上进行克隆,java,generics,inheritance,wildcard,Java,Generics,Inheritance,Wildcard,我试图研究Java中深度复制和浅层复制的区别。我创建了一个示例,其中我使用一个通用类OrganizedGroup来管理Enter奖品、音乐组和其他。然后,我用OrganizedGroup类型的不同组创建了一个容器 import java.util.ArrayList; interface Leader { public void command(); } class Singer implements Leader { @Override public void comma

我试图研究Java中深度复制和浅层复制的区别。我创建了一个示例,其中我使用一个通用类OrganizedGroup来管理Enter奖品、音乐组和其他。然后,我用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
  }
}
import java.util.ArrayList;
接口负责人{
公共无效命令();
}
班长{
@凌驾
公共作废命令(){
System.out.println(“我是歌手”);
}
}
班组长{
@凌驾
公共作废命令(){
System.out.println(“我是老板”);
}
}
类组织组{
私人T曼达多;
公共组织团体(T m){
mandador=m;
}
公共无效职务(){
mandador.command();
}
公共无效集引线(T m){
mandador=m;
}
}
类MusicGroup扩展了OrganizedGroup{
公共音乐组(歌手c){
超级(c);
}
公共音乐剧场(){
System.out.println(“播放音乐…”);
}
}
类Enterprize扩展OrganizedGroup{
公共企业奖(Boss j){
超级(j);
}
公开无效交易(){
System.out.println(“达成交易…”);
}
}
公共级普鲁巴{
公共静态void main(字符串[]args){

ArrayList无需写入:

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

在main的所有句子中都可以这样做。没有编译错误。

clone()在哪里方法?@Bilbobbaggins我做了一个例子来研究深度复制和浅复制之间的差异,但要做到这一点,我首先需要解决最后一行错误,这就是为什么我没有编写克隆方法的原因。yetI建议你先阅读差异。基本上,在shalow克隆中,你只复制你试图克隆的对象中对象的引用ne,而不是对象本身,在深度克隆中,您正在克隆所有对象,即如果B对象在A中,则A上的浅层克隆将创建A的另一个实例,但仍将引用相同的B对象,而在深度克隆中,您将获得B的另一个对象。执行深度克隆的常用方法是序列化。
OrganizedGroup t = go.get(0)