0

ジェネリック ベースのコレクションを持つクラスに基づくジェネリック サービスを作成しようとしています。

public class GenericClass<T> {
   List<T> results;
   public List<T> getResults() {
    return results;
   }
}

この GenericClass に基づいており、T の具体的な実装を持つサービスを作成する方法がわかりません。

public class ServiceManagerImpl<GenericClass<T>> implements ServiceManager<GenericClass<T>> {
    public GenericClass<T> getMyClass() {
    ...
    }
}

しかし、コンパイラはこれを好みません。これを行う方法はありますか?

マルク

4

6 に答える 6

2

あなたは近くにいます...ただ通り抜けTてください:

public class ServiceManagerImpl<T> implements ServiceManager<GenericClass<T>> {
    public GenericClass<T> getMyClass() {
    ...
    }
}
于 2012-07-09T05:11:23.973 に答える
0

このように試してみてください。

     public class ServiceManagerImpl<GenericClass<Object>> implements ServiceManager<GenericClass<Object>> {
          public GenericClass<Object> getMyClass() {
       ...
     }

}

Objectは、整数、文字列、または任意のデータ型に置き換えることができます。

于 2012-07-10T11:19:13.537 に答える
0

その間の内容はタイプパラメータ<>と呼ばれ、宣言の有効なタイプパラメータではありません。GenericClass<T>

Javaジェネリックガイドからの引用

ジェネリッククラスは、次の形式で定義されます。

class name<T1, T2, ..., Tn> { /* ... */ }

山かっこ(<>)で区切られたタイプパラメータセクションは、クラス名の後に続きます。型パラメーター(型変数とも呼ばれます)T1、T2、...、およびTnを指定します。

GenericClass<T>したがって、宣言ではなく、実装で使用する必要があります。

// declaration
public class ServiceManagerImpl<YourGenericType> implements ServiceManager<YourGenericType> {
    public YourGenericType getMyClass() {
    ...
    }
}

// implementation
ServiceManager<GenericClass<Object>> sm = new ServiceManagerImpl<GenericClass<Object>>();
于 2012-07-09T04:29:55.053 に答える
0
public class ServiceManagerImpl<T extends GenericClass<T>> implements ServiceManager<T extends  GenericClass<T>> {
      public GenericClass<T> getMyClass() {
          ...
      }
}
于 2012-07-09T04:37:02.973 に答える
0

JLSのルールに違反しない次の実装を提案できます。

// ServiceManager.java
public interface ServiceManager<E, T extends GenericClass<E>> {
}

// ServiceManagerImpl.java
public class ServiceManagerImpl<E, T extends GenericClass<E>> implements ServiceManager<E, T> {
    public T getMyClass() {
        return null;
    }
}
于 2012-07-09T04:41:09.850 に答える
0

私の答えが合法かどうかはわかりませんが、あなたの要件を満たしているようです:

public class ServiceManagerImpl<T extends GenericClass> implements ServiceManager<T>
{
        @Override
        public T getMyclass() {
            //do your work here;
        }
}

このクラスを宣言すると警告が表示される場合がありますuncheckedが、これは実際に実行されます。

ServiceManager<GenericClass<Integer>> manager = new ServiceManagerImpl<GenericClass<Integer>>();//passed
于 2012-07-10T10:12:17.143 に答える