Java 如何定义应该扩展映射或集合的泛型参数?
我想定义一个泛型参数,它应该扩展Map或Collection,但我不知道怎么做:Java 如何定义应该扩展映射或集合的泛型参数?,java,generics,Java,Generics,我想定义一个泛型参数,它应该扩展Map或Collection,但我不知道怎么做: public <T> void test(T t) {} 公共无效测试(T){ 我可以这样写: public <T extends Map> void test(T t) {} 公共无效测试(T){ 或 公共无效测试(T){ 但我不知道是否可以让t在单个方法中扩展映射或集合。不,这是不可能的,但您可以创建两个单独的方法: public <T extends Map> v
public <T> void test(T t) {}
公共无效测试(T){
我可以这样写:
public <T extends Map> void test(T t) {}
公共无效测试(T){
或
公共无效测试(T){
但我不知道是否可以让t在单个方法中扩展映射或集合。不,这是不可能的,但您可以创建两个单独的方法:
public <T extends Map> void test(T t) {
// do the map part
}
public <T extends Collection> void test(T t) {
// do the collection part
}
并致电:
public <T extends Map> void test(T t) {
mixedTest(t);
}
public <T extends Collection> void test(T t) {
mixedTest(t);
}
public void test(T){
混合试验(t);
}
公共空隙试验(T){
混合试验(t);
}
但我不确定它是否会产生一个好的代码。我将坚持第一部分,针对不同类型的对象使用不同的实现。简短回答:否
您打算如何处理方法中的t
参数?由于Map
和Collection
只有Object
作为它们的通用超类型,因此可以调用t
的方法只有Object
上的方法。(即使是两个接口上的方法,例如size()
,也将被编译器拒绝。)
考虑到这一点,在这种情况下有什么理由不能重载该方法吗?也就是说,为每个所需的参数类型定义一个实现:
public void test(Map<?,?> t) { ... }
public void test(Collection<?> t) { ... }
公共无效测试(Map t){…}
公共无效测试(集合t){…}
如果出于任何原因您不想这样做,那么您似乎可以同样地声明方法以获取Object
,并执行类的运行时类型检查。这在语义上是等价的,因为您必须强制转换以调用特定于Map
或Collection
的方法,尽管这确实意味着类型检查是在编译时而不是在运行时完成的。Java的类型系统不允许您表达这种联合类型依赖关系,所以我看不到任何其他替代方法。那怎么办
public <T extends Map> void test(Map t) {}
公共无效测试(Map t){
及
公共无效测试(集合t){
…然后让Java选择正确的一个来使用?如果您不知道它是一个
映射
还是一个集合
,您将如何使用t
?可能的重复()并且正如前面提到的那样,它会使您的实现更脏
public void test(Map<?,?> t) { ... }
public void test(Collection<?> t) { ... }
public <T extends Map> void test(Map t) {}
public <T extends Collection> void test(Collection t) {}