我正在尝试创建一个基于具有基于泛型的集合的类的通用服务
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() {
...
}
}
但编译器并不喜欢这样。任何想法如何做到这一点?
马克
答案 0 :(得分:2)
你很接近......只需通过T
通过:
public class ServiceManagerImpl<T> implements ServiceManager<GenericClass<T>> {
public GenericClass<T> getMyClass() {
...
}
}
答案 1 :(得分:0)
<>
之间的内容称为Type Parameters,而GenericClass<T>
在声明中不是有效的类型参数。
使用以下格式定义泛型类:
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。