2017-02-07 11 views
0

나는 ModelDecorator 도우미가 있습니다. 나는 이 Java - 공개 클래스의 경계 API

그래서, 클래스 주어진, B는 확장, 그것은 다음과 같이 사용할 수 있습니다 다음 공개 API

class ModelDecorator<T>{ 
    public static <T> ModelDecorator<T> create(Class<T> clazz); 
    public <SUPER> T from(SUPER fromInstance); 
} 
갖고 싶어 :

A a = new A(); 
B b = ModelDecorator.create(B.class).from(a); 

을하지만 T와 SUPER에 대한 경계를 갖고 싶어 그래서 하위 클래스 만 API를 사용하여 인스턴스화 할 수 있는지 확인합니다. 지금이 순간, 내가 할 수있는 :

C c = new C(); 
B b = ModelDecorator.create(B.class).from(c); 

B가 C를

어떤 아이디어가에서 상속하지 않는 경우? 감사합니다

+1

[Java 형식 매개 변수에 낮은 바운드가없는 이유는 무엇입니까?] (http://stackoverflow.com/questions/4902723/why-cant-a-java-type-parameter-have-a-) lower-bound) – shmosel

답변

3

나는 형식 매개 변수 S을 확장 할 형식 매개 변수 T을 제약하기위한 볼 수있는 유일한 방법은 클래스 정의에 이러한 정의를 넣어하는 것입니다 이러한 클래스와

public class ModelDecorator<S, T extends S> { 
    public static <S, T extends S> ModelDecorator<S, T> create(Class<T> clazz) { ... } 
    public T from(S instance) { ... } 
} 

class A {} 
class B extends A {} 
class C {} 

당신에게 이제 다음 코드를 작성할 수 있습니다 :

A a = new A(); 
B b1 = ModelDecorator.<A, B> create(B.class).from(a); // compiles fine 

C c = new C(); 
B b2 = ModelDecorator.<C, B> create(B.class).from(c); // bound mismatch here 

두 번째 B 만들기에 컴파일러 오류가 발생했습니다.

불행하게도 컴파일러가 A 또는 C 형식을 create(B.class)이라는 간단한 메서드 호출에서 유추 할 수 없으므로 형식 매개 변수를 명시 적으로 제공해야합니다.

+0

이것은 사실 현재의 상황입니다. 난 그냥 내 API를 이런 식으로 좋아하지 않아 :(너무 까다롭게 맞습니까?) –

+0

가독성이나 유용성에 대한 말은하지 않았습니다. 아마도 적절한 기술로 문제를 해결하려고 시도했을 것입니다 ([XY 문제] (http : //meta.stackexchange.com/questions/66377/what-is-the-xy-problem))? – Seelenvirtuose

+0

@Seelenvirtuose 내가 틀릴 수도 있지만'create'는'정적'메소드입니다.'S'와'T' public static ModelDecorator 에서 'public static ModelDecorator create'는 public class ModelDecorator 와 동일한 타입이어야하며 그렇지 않은 경우에는'static' 메소드와 – CKing