2015-09-03 50 views
-1

我在研究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 
    } 
} 

在最後一行我嘗試修改第一組的組長(我需要做的是,爲了見淺拷貝和深拷貝之間的差別(比如我克隆進入GO 2)),但它提供了以下編譯錯誤:

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是抽象的),但是我需要解決這個問題以便用泛型實踐。

+0

其中是clone()方法? –

+0

[實現與擴展。何時使用?有什麼區別?](http://stackoverflow.com/questions/10839131/implements-vs-extends-when-to-use-whats-the-difference) –

+0

@BilboBaggins我做了一個例子來研究深度和淺拷貝,但要做到這一點我首先需要解決最後一行錯誤,這就是爲什麼我沒有寫一個克隆方法 – Rodrigo

回答

0

有沒有必要寫:

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

相反,我寫的只是:

OrganizedGroup t = go.get(0) 

和同樣可以在所有主要的句子來完成。沒有編譯錯誤。