>"真的吗?-6ren"> >"真的吗?-我一直在使用一些通用方法从元素的可变参数创建集合,例如 public Set createSet( T... elements ) { ... 然而,最近我遇到了编译器没有按照我的预期去做的情况。以-6ren">
gpt4 book ai didi

java - "Set>"真的吗?

转载 作者:太空狗 更新时间:2023-10-29 22:34:53 27 4
gpt4 key购买 nike

我一直在使用一些通用方法从元素的可变参数创建集合,例如

public <T> Set<T> createSet( T... elements ) { ...

然而,最近我遇到了编译器没有按照我的预期去做的情况。以下 createSet() 仅使用 s3 作品。

Set<Class<? extends Throwable>> s1 = createSet( Exception.class, RuntimeException.class );

Set<? extends Class<Throwable>> s2 = createSet( Exception.class, RuntimeException.class );

Set<? extends Class<? extends Throwable>> s3 = createSet( Exception.class, RuntimeException.class );

谁能清楚地解释为什么 s3 有效,以及我对 s1 的想法可能有什么问题——这是我最初的编码?谢谢。

最佳答案

问题出在推理逻辑上。 s1如果您显式键入方法调用,则工作正常(好吧,可变参数警告除外):

Set<Class<? extends Throwable>> s1 = 
this.<Class<? extends Throwable>>createSet( Exception.class, RuntimeException.class );

但默认情况下给定参数的返回类型是 Set<Class<? extends Exception>> (我想是因为这是最具体的可能性)。你只需要在这里给编译器一个提示,因为没有它,它实际上是在尝试这样做:

Set<Class<? extends Exception>> temp = createSet(Exception.class, RuntimeException.class);
Set<Class<? extends Throwable>> s1 = temp;

这是不允许的,因为从编译器的角度来看,您可以将 OutOfMemoryError.class进入temp这将违反其类型。

编辑

原因s3适合你是因为 Class<? extends Exception>可分配给 Class<? extends Throwable> :

//this works
Class<? extends Exception> exceptionRef = Exception.class;
Class<? extends Throwable> throwableRef = exceptionRef;

等等 extends关键字使您能够从 Set<Class<? extends Exception>> 进行转换到 Set<? extends Class<? extends Throwable>> :

//this works too
Set<Class<? extends Exception>> exceptionSetRef = ...;
Set<? extends Class<? extends Throwable>> throwableSetRef = exceptionSetRef;

不幸的是,这可能不是您想要的,因为现在您无法将任何内容放入 throwableSetRef .

关于java - "Set<? extends Class<? extends Throwable>>"真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7982972/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com