2017-08-26 6 views
0

クラス情報を注入する必要があるため、Guice型リテラル組み込み注入を使用したいと思います。Guice:なぜTypeLiteral <T> getRawType()メソッドは、クラス<T>の代わりにクラス<? super T>を返しますか?

public class Foo<T> { 

    private Class<T> clazz; 

    @Inject 
    public Foo(TypeLiteral<T> literal) { 
     this.clazz = literal.getRawType(); 
    } 
} 

それは完璧に働いているだろうが、getRawType()方法はClass<? super T>を返します。以下の例を参照してください。内部的にはclazz変数が別のクラスのメソッドの引数として使用されています。 タイプをClass<? super T>に変更した場合は、一連のクラスを再作成する必要があります。

ここで最も洗練されたソリューションは何ですか?次のように、未チェックとしてそれを持ってしまうかもしれませんがあなたが、その場合にはClass<T>に生タイプをキャストすることができ

答えて

1

@Inject 
public Foo(TypeLiteral<T> literal) { 
    this.clazz = (Class<T>) literal.getRawType(); 
} 

を、それがそうなぜ、あなたの質問に答えるために、同様の答えがあります〜Why does Guava's TypeToken<T>.getRawType() return Class<? super T> instead of Class<T>。その答えとして非常に素晴らしい例があります。

+0

ええ、私はそれをキャストすることができます、どのように安全ですか?なぜそのメソッドはクラスを返さないのですか? –

+0

@IhorM。理想的には、これは共有リンクの複製でなければなりません。それに投票する – nullpointer

関連する問題