当前位置: 首页 > 知识库问答 >
问题:

通配符与TypeParameter

裴威
2023-03-14
class Employee<T extends Number> {  // valid
}

class Employee<? extends Number> { // invalid
}

private static void test(List<? super Number> list1) { // valid
}

private static <T>void test(List<T super Number> list1) { // invalid
}

t之间到底有什么区别,什么时候使用什么?

为什么对于类定义,不起作用,但它可以用于列表;为什么t可以用于类定义,但不能用于列表


共有1个答案

晏经武
2023-03-14

在引入泛型类型标记t之前,不能使用它。

在方法示例中,您试图在错误的地方声明t,这是无效语法。你得事先介绍一下。

然而,对于类示例,您已经将其放在了正确的位置。

public class Foo< HERE > { ... }
public < HERE > void foo(...) { ... }
public class Foo<T extends Number> { ... }

// or

public <T extends Number> void foo(...) { ... }
public <T extends Number> void foo(List<T> list) { ... }

请注意,T super number是无效的,因为它没有什么意义,除了TnumberObject之外,不能提供更多信息,这取决于您试图实现的目标。您可以在Java泛型方法:super不能使用?

通配符是另一回事。它们不是必须首先引入的泛型类型标记,例如t。相反,它们澄清了您想要接受的类型范围。

例如,类似于

public static void foo(List<? super Dog> list) { ... }
public static void foo(List<? extends Dog> list) { ... }

可以用列表 列表 调用。我们称这样的列表为dog的生产者(或提供者)。准确地说,这些都是可以提供狗的名单。所以dog dog=list.get(0)可以工作。

您可以阅读更多关于通配符是什么以及它们如何在PECS(Producer Extends Consumer Super)中工作的细节?

通常,当您实际上仍然需要在整个代码中维护类型安全时,您将使用泛型类型标记t。即。当您需要能够为类型命名时。否则使用通配符

public static <T> void addToList(List<T> list, T element) {
    list.add(element);
}
public static void printAll(List<?> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}
 类似资料:
  • null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。

  • 问题内容: 我在redis中有一个hach集,如下所示。 如果我叫hgetall abcd,它将为我提供哈希中的所有字段。我的目标是仅获取以“ rec.number”开头的哈希集的那些字段。当我打电话喜欢 它给我的结果像 有没有一种方法可以只检索那些以我期望的模式开头的键的数据?我只想检索那些键,因为我的数据集包含许多其他不相关的字段。 问题答案: HMGET在字段名称中不支持通配符。您可以为此使

  • 这个问题的答案表明,当方法采用通配符泛型类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特) 据我所知,方法do1有,因此d2只能被访问,不能被修改。方法d2具有,因此可以访问和修改c2,并且没有编译错误。 通用指南

  • 问题内容: 我有一个接口将对象转换为字符串: 以及用于存储所有可用转换器的地图: 现在,我有了要转换的异构数据列表,如下所示: 但是此代码无法编译: 我应该如何更改代码? 问题答案: 您面临的问题称为通配符捕获。Java无法识别将从数据中接收的类型。尝试以两种方式中的任何一种重构代码 方法1:如下 更改您的界面 方法2: 通过类型推断来捕获通配符的Helper方法 创建如下的帮助方法, 如下调用此

  • 使用指南 - 统计设置 - 概述 - 通配符与正则表达式 1、通配符: 通配符,即 * 符号,可以添加在url中,代替任意字符。假设您添加的网站域名是url.com,则通配符的使用规则如下: 网站域名后不能直接添加通配符,如url.com* 这种方式会提示错误;通配符与域名至少间隔一个字符,如url.com?abab需用url.com?* 来表示; url.com/*,表示包含url.com/ 这

  • “帮助系统”一节 脱字符 Shell 中的一些功能是通过特殊符号作为控制字符来实现的,上面已经介绍了很多了。这产生一个问题,如果一个文件名中,刚好包含了这些字符,比如 ; ,就很难对它进行操作。使用 less 浏览这个文件 less ;xxx less 会很快返回一个错误信息,因为并没有一个文件名作为操作对象。接着,Shell 会报告,系统中没有 xxx 这个命令。 这是因为 Shell