2014-02-13 64 views
1

我有一個Java類:確保Groovy的ArrayList的對象是同一類

public class Parent 
{ 
    public int parentVal; 
} 

,將有像幾個繼承Groovy類:

class Child1 extends Parent 
{ 
    def value1; 
} 

class Child2 extends Parent 
{ 
    def value2; 
} 

我想有一個集合Groovy的,將被限制爲僅包含Child1或CHILD2實例,因此,如果集合包含Child1情況下,它不能包含CHILD2實例(或其他任何東西)。這是我嘗試在此:

import java.util.ArrayList; 

public class MyCollection<T extends Parent> 
{ 
    private ArrayList<T> list = new ArrayList<T>(); 

    public void setType(Class<T> cls) 
    { 
     this.cls = cls; 
    } 

    public void add(T item) throws Exception 
    { 
     if(item.getClass() == cls) 
     { 
      list.add(item); 
     } 
     else 
     { 
      throw new Exception("wrong argument type"); 
     } 
    } 

    public T getItem(int index) 
    { 
     return list.get(index); 
    } 

    private Class<T> cls; 
} 

,並在我的Groovy腳本:

def c1 = new Child1() 
c1.value1 = 1 
c1.parentVal = 2; 

def c2 = new Child2() 
c2.value2 = 2 
c2.parentVal = 3; 

def myCol = new MyCollection() 
myCol.setType(Child1.class) 

myCol.add(c1) 
myCol.add(c2) // throws an exception 

的最後一條語句真的拋出了「錯誤的參數類型」的例外,但我是新來的Java和Groovy,所以我很可能整個事情都做錯了。任何意見是極大的讚賞。

回答

3

你做的方式是拋出運行時錯誤。這沒有錯,只是在編譯時不檢查。我不知道你能,使用Java的泛型,確定一個上限和下在同一聲明的約束。通過簡單地使用<T extends Parent>它說你是爲東西延伸Parent,並且包括Child2,而你只想要Child1。另一種我能想到的是對父定義泛型和在類本身是泛型參數兒童類聲明它。然後它會引發編譯器錯誤。還要注意@CompileStatic@TypeChecked需要:

Parent類與泛型聲明:

class Parent<T> { 
    int parentVal 
} 

class Child1 extends Parent<Child1> { 
    def value1; 
} 

class Child2 extends Parent<Child2> { 
    def value2; 
} 

class MyCollection<T extends Parent<T>> { 
    def list = new ArrayList<T>() 

    void add(T item) throws Exception { 
     list.add(item); 
    } 

    T getItem(int index) { 
     return list.get(index); 
    } 
} 

而且測試腳本。注意註釋行不會編譯:

//and in my Groovy script: 
@groovy.transform.TypeChecked 
def main() { 
    def c1 = new Child1() 
    c1.value1 = 1 
    c1.parentVal = 2; 

    def c2 = new Child2() 
    c2.value2 = 2 
    c2.parentVal = 3; 

    def myCol = new MyCollection<Child1>() 

    myCol.add(c1) 
    //myCol.add(c2) // doesn't compile 
} 


main() 
+0

謝謝都試圖爲答案 –

1

由於常規支持泛型

http://groovy.codehaus.org/Generics

你也許可以做一個聲明和ArrayList<Child1>常規可以解決這個問題爲您服務。

+0

它如果我聲明看來,事件和ArrayList 在Groovy它接受CHILD2情況或事件的整數 –

+3

與'@ CompileStatic'或'@ TypeChecked' –

相關問題