2014-02-13 1 views
1

같은 클래스의 지 확인 Groovy는 Child1 또는 Child2 인스턴스 만 포함하도록 제한되므로 컬렉션에 Child1 인스턴스가 포함되어 있으면 Child2 인스턴스 (또는 다른 것)를 포함 할 수 없습니다. 이것이 내 시도 :그루비의 ArrayList 객체 내가 자바 클래스가

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; 
} 

내 그루비 스크립트 :

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 

는 마지막 문장은 정말 "잘못된 인수 유형"예외가 발생합니다,하지만 난 내가 자바와 그루비에 새로운 해요 아마 모든 일을 잘못하고있는 것 같아. 어떤 조언을 크게 주시면 감사하겠습니다.

답변

3

그런 식으로 런타임 오류가 발생했습니다. 잘못된 것은 아니며 컴파일시에는 확인되지 않습니다. Java의 generics를 사용하여 동일한 선언에서 상한과 하한을 정의 할 수 있는지 확신 할 수 없습니다. 단지 <T extends Parent>을 사용하면 을 확장하는 모든 항목에 대해 Child2을 포함하고 있다고 말하면서 Child1 만 필요합니다. 내가 생각할 수있는 대안은 Parent에 제네릭을 정의하고 클래스 자체를 일반 매개 변수로 사용하여 Child 클래스에서 선언하는 것입니다. 그런 다음 컴파일러 오류가 발생합니다. 또한주의 @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

은 끝내 당신은 아마 당신을 위해 문제를 해결할 것 ArrayList<Child1>와 그루비 선언과 함께 할 수있는 제네릭

http://groovy.codehaus.org/Generics

을 지원하기 때문에.

+0

그것은 내가 선언하는 경우 해당 이벤트를 표시하고 그루비의 ArrayList를 는'@ CompileStatic' 또는'@ TypeChecked' –

+3

자식 2 인스턴스 또는 이벤트 정수를 받아 대답은 –