Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何定义应该扩展映射或集合的泛型参数?_Java_Generics - Fatal编程技术网

Java 如何定义应该扩展映射或集合的泛型参数?

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

我想定义一个泛型参数,它应该扩展Map或Collection,但我不知道怎么做:

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