当前位置: 首页 > 面试题库 >

为什么要使用通配符捕获助手方法?

狄旻
2023-03-14
问题内容

引用:通配符捕获帮助器方法

它说创建一个辅助方法来捕获通配符。

public void foo(List<?> i) {
    fooHelper(i);
}        
private <T> void fooHelper(List<T> l) {
    l.set(0, l.get(0));
}

仅在下面使用此函数不会产生任何编译错误,并且似乎以相同的方式工作。我不明白的是:您为什么不只使用它而避免使用帮助器?

public <T> void foo(List<T> l) {
    l.set(0, l.get(0));
}

我以为这个问题可以归结为:通配符和泛型有什么区别?所以,我去了:通配符和泛型之间的区别。它说要使用类型参数:

1)如果要对不同类型的方法参数强制执行某种关系,则不能使用通配符来实现,必须使用类型参数。

但是,这不正是具有辅助功能的通配符实际上在做什么吗?是否通过设置和获取未知值来在不同类型的方法参数上强制建立关系?

我的问题是:如果必须定义一些需要在不同类型的方法args上建立关系的东西,那么为什么首先要使用通配符,然后再使用辅助函数呢?

合并通配符似乎是一种不明智的方法。


问题答案:

在这种情况下,是因为List.set(int,E)方法要求类型与列表中的类型相同。

如果您没有辅助方法,则编译器将不知道?for 是否相同List<?>以及返回值是否相同,get(int)因此会出现编译器错误:

The method set(int, capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (int, capture#2-of ?)

使用helper方法,您告诉编译器,类型是相同的,我只是不知道类型是什么。

那么为什么要使用非辅助方法呢?

泛型直到Java 5才被引入,因此有很多代码早于泛型。Java
5之前List的版本现在是Java,List<?>因此,如果您试图在具有通用意识的编译器中编译旧代码,那么如果您无法更改方法签名,则必须添加这些帮助程序方法。



 类似资料:
  • 参考:通配符捕获辅助方法 它说创建一个助手方法来捕获通配符。 仅使用下面的函数不会产生任何编译错误,并且似乎以同样的方式工作。我不明白的是:为什么你不直接使用这个,避免使用助手? 我认为这个问题真的可以归结为:通配符和泛型有什么区别?所以,我去了这个:通配符和泛型之间的区别。它说使用类型参数: 1)如果你想对不同类型的方法参数强制执行某种关系,你不能用通配符来做到这一点,你必须使用类型参数。 但是

  • 以下代码不能在Eclipse中编译。它说“类型Abc中的方法putHelper(List,int,E)不适用于参数(List<.capture#8-of extends E>”,int,E)“ 我不明白为什么会这样?因为下面的代码可以正常工作。

  • 问题内容: 在有效的Java(第275页)中,有以下代码段: 捕获中断异常以重新引发它有什么用?为什么不让它飞呢? 问题答案: 简单的答案是,这是一个检查的异常,它不在方法(或方法)的签名中。所以你必须抓住它。一旦发现它,建议您设置为设置中断标志。除非您确实打算压缩中断。

  • 问题内容: 在以下代码段中: 尽管类型似乎完全匹配,但分配是错误的。 我通过将Collection的类型指定为另一个通用参数,设计出了一种肮脏的解决方法,如下所示: 但是该参数实际上是“无关”类型,只会使API复杂化,在保持类型安全的同时,有没有什么方法可以摆脱它呢? 谢谢。 问题答案: 这样做就可以了: 您仍然可以像这样使用迭代器: 作为参考,请阅读get and put原理 (最初来自Java

  • 在这个问题中,我看到我可以使用帮助方法将通配符泛型“捕获”到类型T中以执行类型安全操作,如下所示: 但是当我尝试使用关键字执行此操作时,它不起作用: 我得到以下错误: 当使用扩展关键字时,有没有办法捕获通配符? 我的背景是,我有一个扩展给定类a的类列表,每个类都有一个不同的泛型参数T。对于每个类,我想获得对其T类的引用,我试图安全地进行类型转换。

  • 方法在类型不适用于参数