2014-02-13 22 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' –

相关问题