我试图研究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是抽象的)但我需要用泛型来解决这个问题。
答案 0 :(得分:0)
没有必要写:
OrganizedGroup< ? extends Leader> t = go.get(0);
相反,我写道:
OrganizedGroup t = go.get(0)
同样可以在所有主要句子中完成。没有编译错误。