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

You are close... just pass the T through:

public class ServiceManagerImpl<T> implements ServiceManager<GenericClass<T>> {
    public GenericClass<T> getMyClass() {
    ...
    }
}
于 2012-07-09T05:11:23.973 回答
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<GenericClass<Object>> implements ServiceManager<GenericClass<Object>> {
          public GenericClass<Object> getMyClass() {
       ...
     }

}

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

于 2012-07-10T11:19:13.537 回答
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 回答