2011-01-20 3 views
0

나는 두 개의 클래스가 있습니다 ItemArguments에서Java : 반환 값을 자동으로 캐스팅하는 방법이 있습니까?

public abstract class Arguments { 
    public List execute() { 
     // do some stuff and return a list 
    } 
} 

// and a child : 
public class ItemArguments { 
    public List<Item> execute() { 
     return super.execute(); 
    } 
} 

당신이 볼 수 있듯이,이 방법은 실행 조금 쓸모없는, 그러나 그것없이, 나는 인수의 실행 방법에 대한 모든 내 전화를 캐스팅해야합니다.

ItemArguments에서 execute 메서드를 제거하고 캐스트가 호출되는 위치에서 캐스트를 수행하지 않도록 할 수 있습니까?

도움 주셔서 감사합니다. 당신은 심지어 당신이 T에 너무

public class Arguments<T> { 
    public List<T> execute() { 
    // blah 
    } 
} 

Arguments<Item> o1 = new Arguments<Item>(); 
List<Item> o2 = o1.execute(); 

호출 방법을 수행하는 다른 이유가 없다면 서브 클래 싱 할 필요가 없습니다

답변

10

제네릭

public abstract class Arguments<T> { 
    public List<T> execute() { 
    // some stuff 
    return new ArrayList<T>(); 
    } 
} 

public class ItemArguments extends Arguments<Item> { 

} 

은 꽤 간단하지 않습니다. T는 컴파일러에 의해 지워 지므로 런타임에는 사용할 수 없습니다. 당신이 인수

public class Foo { 
    public static void something() { ... } 
} 

public class Arguments<T extends Foo> { 
    private Class<? extends Foo> foo; 
    public Arguments(Class<? extends Foo> foo) { 
    this.foo = foo; 
    } 
    public List<T> execute() { 
    foo.something(); 

    } 
} 

더 나은 방법이 있습니다를 인스턴스화 할 때 해결 방법을 이해하기 쉬운 클래스에 전달하는 것입니다, 그러나 이것은 패턴 마스터 :

+0

위대한없이 대부분 이해할 수있다! 완전한!! 감사!!! :) –

+0

다음 받아들입니다 :) (진드기를 클릭하십시오) – ptomli

+0

그냥 조금 질문 : 어떻게 T는 사용할 수 있습니까? T.에 위치한 정적 메서드를 호출해야합니다. 좋은 방법은 Reflection을 사용하는 것이지만 T.getDeclaredMethod는 작동하지 않는다고 생각합니다./ –

관련 문제