泛型:基于泛型类的泛型类

时间:2012-07-08 17:40:17

标签: java generics

我正在尝试创建一个基于具有基于泛型的集合的类的通用服务

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() {
    ...
    }
}

但编译器并不喜欢这样。任何想法如何做到这一点?

马克

6 个答案:

答案 0 :(得分:2)

你很接近......只需通过T通过:

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

答案 1 :(得分:0)

<>之间的内容称为Type Parameters,而GenericClass<T>在声明中不是有效的类型参数。

来自java generic guide

  

使用以下格式定义泛型类:

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

由尖括号(&lt;&gt;)分隔的类型参数部分跟在类名后面。它指定类型参数(也称为类型变量)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>>();

答案 2 :(得分:0)

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

答案 3 :(得分: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;
    }
}

答案 4 :(得分: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

答案 5 :(得分:0)

你应该尝试喜欢这个;

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

}

您可以根据需要将Integer或String或任何数据类型替换为Object。

相关问题