2012-02-20 86 views
3

我遇到了Java中泛型的问题,我无法找到类似方式使用泛型的人的在线解决方案或示例。我有一组处于相同请求/响应结构中的方法。例如,用户填充Request对象中的字段,将该对象传递给帮助器方法,并且它们返回Response对象。我的所有请求对象都从一个公共的Request超类(以及类似于Response超类的Response对象)扩展而来。我希望我的助手类也具有一致的结构,因此我使用了一个接口。下面是一些代码来说明...接口中的Java泛型

请求超类:

public class SuperRequest { 
    // ... 
} 

示例请求子类:

public class SubRequest extends SuperRequest { 
    // ... 
} 

响应超类:

public class SuperResponse { 
    // ... 
} 

实施例响应亚类:

public class SubResponse extends SuperResponse{ 
    // ... 
} 

接口:

public interface SomeInterface { 
    public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request); 
} 

你可以从界面看,我想传递一个对象,它是SuperRequest一个孩子,我想返回一个对象,它是SuperResponse一个孩子。下面是我的实现:

public class SomeImplementation implements SomeInterface { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
} 

在Eclipse中,我得到的编译错误,因为编译器告诉我,我有未实现的方法和@Override符号“没有覆盖的超类型方法”。

任何人都可以帮助我吗?我的语法是不正确的还是我对泛型的理解有点偏离?任何帮助是极大的赞赏!

回答

7

试着改变你的接口和实现到:

interface SomeInterface<T extends SuperRequest, U extends SuperResponse> { 
    public U someMethod(T request); 
} 

class SomeImplementation implements SomeInterface<SubRequest, SubResponse> { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
} 
+0

太棒了!我有一种感觉,我只是在语法/声明上有点偏离。谢谢您的帮助! – ggrigery 2012-02-20 16:51:17

+0

没问题,一定要接受最好的答案;) – ggreiner 2012-02-20 16:51:45

1

因为它的立场,中SomeInterface的实现必须实现参数化方法,即:

public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request); 

它不能选择一个特定的子类以替代TU

接口本身必须是通用的SomeInterface<T extends SuperRequest, U extends SuperResponse>,然后子类可以选择TU的具体实现。

1

当你实现接口时,你必须声明类型。试试这个:

public class SomeImplementation implements SomeInterface<SubRequest,SubResponse> { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
}