3

私はすべての DI に Guice を使用する API を作成しており、API 開発者からすべての Guice の「もの」を隠したいと考えています。私は次のものを持っています:

public class MyAppModule extends AbstractModule {
    @Override
    public void configure(Binder binder) {
        // Omitted for brevity...
        // For instance, binds interface type Animal to impl type Dog, etc.
    }
}

public class MyInjector {
    public abstract<?> inject(Class<?> clazz) {
        MyAppModule module = new MyAppModule();
        Injector injector = Guice.createInjector(module);

        return injector.getInstance(clazz);
    }
}

// So that API developers can just use Animal references and Guice will
// automatically inject instances of Dog
MyInjector injector = new MyInjector();
Animal animal = injector.inject(Animal.class); // <-- Guice returns a Dog instance

問題は私のMyInjector#inject(Class<?>)方法にあります。このように書くと、コンパイル エラーが発生します。

Multiple markers at this line
- Return type for the method is missing
- Syntax error on token "?", invalid TypeParameter

Guice docsによると、 をInjector#getInstance返しますabstract<T>。可能であれば、API 開発者にとって物事を単純にするために、ジェネリックや明示的な型キャストを避けたいと考えています。ここにオプションはありますか?もしそうなら、それらは何ですか? そうでない場合、なぜですか?前もって感謝します。

4

2 に答える 2

5

ワイルドカード?を使用しないでくださいT

また、抽象メソッドには実装を含めることができないため、それを削除する必要があります (メソッドをオーバーライドしています)。

public <T> T inject(Class<T> clazz) {
    MyAppModule module = new MyAppModule();
    Injector injector = Guice.createInjector(module);

    return injector.getInstance(clazz);
}
于 2012-12-24T17:38:48.760 に答える
2

次のようなものを使用する必要があります。

public <T> T inject(Class<T> clazz);

T代わりに使用すると?、タイプのオブジェクトを返すことができますT

ちなみに、これは次のことと同じInjectorです:

public abstract T getInstance (Class<T> type)

: あなたのコードでは、抽象メソッドを実装しようとしています。abstract キーワードを削除する必要があります。そうしないと、構文エラーが発生します。抽象メソッドに実装を含めることはできません (これはサブクラスで行われます)。

于 2012-12-24T17:39:54.870 に答える