generics中的wildcard ?代表unknown type,并且只接受null. 然而,在下面的示例中,constructor接受(for example)一个String对象,即使我声明了一个Test<?>的实例.

public class Test<T> {
    private T object;
    public Test(T object) {
        this.object = object;
    }
    public void set(T object) {
        this.object = object;
    }
    public static void main(String[] args) {
        Test<?> test = new Test<>("Test");    // compiles fine
        //test.set("Test");    // compiler error
    }
}

为什么这个编译正常?

推荐答案

构造函数接受(例如)String个对象,即使我声明了一个Test<?>的实例.

不是的.你已经宣布了一架Test<?>型的variable.您已经为大约X创建了一个Test<X>类型的instance,编译器必须自己计算出来,以便整个语句是有效的.也就是说,这里:

        Test<?> test = new Test<>("Test");    // compiles fine

...<>并不表示"从变量的类型复制类型参数"或类似的意思.Test<?> is not表达式new Test<>("Test")的类型.所选的类型参数必须使类型可赋值给类型Test<?>,这是必须满足的约束之一,但这是微不足道的,因为任何X都可以做到这一点.

形式上,Java会推断出满足所有约束的最具体的类型参数,使语句有效.new Test<X>("Test")只对相对较少的X有效:

  • java.lang.Object
  • java.lang.Serializable
  • java.lang.Comparable<String>Comparable的其他几个变种
  • java.lang.CharSequence
  • java.lang.constant.Constable(从Java 12开始)
  • java.lang.constant.ConstantDesc(从Java 12开始)
  • java.lang.String
  • 以上组合的交叉口类型

String是其中最具体的,所以它是被选中的.

然而,在实践中,Java实际上根本不必 Select 特定的类型参数.它只需要让自己确信,至少有一个是可行的.


表达式test.set("Test")则是另一种情况.分配给test的对象被推断为具有类型Test<String>,这并不重要.在这里,与在所有情况下一样,Java基于所涉及的declared种变量类型来分析表达式.test用类型Test<?>声明.因此,Java test.set()肯定不会接受任何类型作为参数.然而,值null与每个引用类型兼容,因此无论对象test引用的特定类型参数可能是什么,null都是test.set()的可接受自变量.

Java相关问答推荐

如何审查Java dtos中的自定义注释字段?

Javascript更新alert 可扩展内容样式与CSS—按钮更多/更少

JsonPath在多个线程中返回错误的值

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

SpringBootreact 式Web应用程序的Spring Cloud Configer服务器中的资源控制器损坏

只需最少的代码更改即可将版本号标记添加到日志(log)

Java中将文本拆分为数字或十进制数字和字符串

Java Mooc.fi Part 12_01.Hideout -返回和删除方法

Kotlin Val是否提供了与Java最终版相同的可见性保证?

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

IntelliJ IDEA依赖项工具窗口丢失

找出承载Cargo 的最小成本

如何从命令行编译包中的所有类?

在Java中将对象&转换为&q;HashMap(&Q)

JXBrowser是否支持加载Chrome扩展?

如何使用Java ZoneID的区域设置?

Java递归泛型是否可以被视为继承和重写的语法糖

由于可为null,无法在kotlin中实现java接口

无泄漏函数的Java DRY

为什么 Random() 的行为不符合预期?