2017-10-26 2 views
0

guice를 배우기 시작했고 guice를 사용하여 일반적인 유형을 주입하기 시작했습니다. 그물에있는 모든 솔루션은 new TypeLiteral<Generic<Type>>(){}과 같은 것을 사용하는 것 같습니다. 그러나이 작업을 수행하려고하면 TypeLiteral의 생성자가 보호되어 있음을 보여줍니다. TypeLiteral.get()을 사용하여 제네릭 주입을 수행하려면 어떻게합니까? 샘플 코드 :typeliteral하지만 typeliteral 생성자가 guice에 제네릭을 주입했습니다.

public interface Repository<T> { 
    void save(T item); 
    T get(int id); 
} 

public StringRepository implements Repository<String> { 
    @Override 
    public void save(String item) { 
    // do saving 

    } 
@Override 
public String get(int id) { 
    // get item and return 
    return item; 
} 
} 

public MyModule extends AbstractModule{ 
    @Override 
    public void configure() { 
     .... 
    TypeLiteral<Repository<String>> typeLiteral = 
        TypeLiteral.get((Repository<String>.class));//does not work 

    //does not work either because constructor is protected 
    bind(new TypeLiteral<Repository<String>>(){}).to(StringRepository.class); 

} 

} 

Screenshot of my problem

+1

"생성자가 보호되어 있기 때문에 작동하지 않습니다."protected는 하위 클래스에서 액세스 할 수 있음을 의미하므로 액세스 할 수 있어야합니다. 내 말은, 이것은 문서가 그것을 사용하는 방법을 정확하게 말한 것입니다 ... –

+0

나는 그것도 잘 작동 했으므로 노력했고, 그렇게합니다. 정확히 무엇이 당신이 그것을 작동하지 않는다고 생각하게하는지 보십니까? –

+0

귀하의 스크린 샷은 질문의 코드와 완전히 다릅니다. {} 없이는 작동하지 않습니다. –

답변

3

당신의 텍스트는 new TypeLiteral<Generic<Type>>(){}을 말한다. 스크린 샷에 new TypeLiteral<Generic<Type>>()이 표시됩니다. 첫 번째는 {}이고 두 번째는 그렇지 않습니다. 중괄호는 매우 중요합니다. 즉 표현식을 TypeLiteral의 새 인스턴스를 만드는 것에서 으로 변경하여 익명 하위 클래스TypeLiteral을 만들고 해당 하위 클래스의 인스턴스를 만듭니다.

제네릭 형식 삭제를 해결하려면 필요합니다. TypeLiteral이 그 목적을 달성하려면 런타임시 제네릭 형식 인수가 무엇인지 알아야합니다. 타입 지우기는 제네릭 클래스의 단순 인스턴스가 런타임시 해당 유형 인수가 무엇인지를 알지 못함을 의미합니다. 그러나 일반 클래스에서 상속 한 클래스는 상속에서 어떤 유형의 인수를 사용했는지 런타임에 알고 있습니다. 즉,

// <String> is erased at run time. 
new ArrayList<String>(); 

// <String> is preserved at run time, as part of the class's information. 
class MyList extends ArrayList<String> { } 

// A class identical to MyList is created, except without the name, and an instance of that class is created. 
new ArrayList<String>(){}; 
+0

이것은 {}이 필요한 이유에 대한 설명입니다. List를 ArrayList 또는 다른 것으로 대체하면 upvote가됩니다. List는 인터페이스이므로 extends List 또는 new List()를 작성할 수 없습니다. –

+0

@cppbeginner 분명히 나는 ​​최근에 너무 많은 C# 작업을 해왔다. 여기서'List'는 클래스이고 인터페이스는'IList'이다. 결정된. – Douglas

관련 문제