为什么通配符类型参数不在自引用类型的包装器范围内

狙击步枪2004

我有一个接口,其中包含返回或需要实例化类型实例的方法。为此,我创建了形式的类型变量U extends I<U>以用作返回类型。当然的目的U是实现类:

interface SelfReferringInterface<U extends SelfReferringInterface<U>> {
}

现在,我有一个实现类,其中包含一个不相关的类型变量:

class RestrictingType<T> implements SelfReferringInterface<RestrictingType<T>> {

}

和一个包装一个实例的类SelfReferringInterface

class Wrapper<T extends SelfReferringInterface<T>> {
}

对于Wrapper采用以下通配符实例的类型,以某种方式我会收到类型推断错误RestrictingType

public class Main {

        public static void main(String... args) {
                // This type checks
                SelfReferringInterface<?> test1;
                // This too
                RestrictingType<?> test2;
                // And this
                Wrapper<RestrictingType<Object>> test3;
                // This fails
                Wrapper<RestrictingType<?>> test4;
                // Interestingly this does succeed
                Wrapper<? extends RestrictingType<?>> test5;
        }
}

进行编译会产生以下错误:

Main.java:23: error: type argument RestrictingType<?> is not within bounds of type-variable T
                Wrapper<RestrictingType<?>> test4;
                                       ^
  where T is a type-variable:
    T extends SelfReferringInterface<T> declared in class Wrapper
1 error

为什么RestrictingType<?>不在范围之内T为什么功能相似? extends RestrictingType<?>没有问题?

newacct

Wrapper<RestrictingType<T>>适用于任何给定类型,T因为我们知道Restricting<T>实现SelfReferringInterface<RestrictingType<T>>但是,Wrapper<RestrictingType<?>>由于Restricting<? #1>可能无法实施而无法正常工作SelfReferringInterface<RestrictingType<? #2>>通配符?表示未知类型,在两个地方它们可能是两种不同的未知类型

这是查看为什么必须这样做的另一种方式:假设您的Wrapper<T>类可以容纳多个包装类型的项T然后,界限<T extends SelfReferringInterface<T>>意味着应实现任何一项的类型SelfReferringInterface<type of any other item>,就像如何class SortedList<T extends Comparable<T>>意味着列表中的任何一项应与列表中的任何其他项具有可比性一样。但是,如果您有一个Wrapper<RestrictingType<?>>,则可以将RestrictingType<String>都添加RestrictingType<Integer>到其中,因为这两个类型都是的子类型RestrictingType<?>但是,RestrictingType<String>由于没有实施SelfReferringInterface<RestrictingType<Integer>>,因此合同被打破。

至于为什么Wrapper<? extends RestrictingType<?>>起作用,我不确定确切如何,但是? extends通配符意味着您不能在其中添加任何项目,因此您不能使用它来破坏合同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类型参数T#1不在类型变量T#2的范围内

来自分类Dev

类型参数T#1不在类型变量T#2的范围内

来自分类Dev

为什么“变量不在范围内”

来自分类Dev

为什么`char`数据类型中的数据溢出会导致将值包装在其范围内?

来自分类Dev

通用二进制搜索树Java类型参数不在范围内

来自分类Dev

类型参数“ S”的推断类型“ S”不在其范围之内,为什么?

来自分类Dev

类型名称`int`未定义或不在范围内

来自分类Dev

包对象中定义的类型不在范围内

来自分类Dev

泛型;类型实参不在其范围内

来自分类Dev

包对象中定义的类型不在范围内

来自分类Dev

类型名称`int`未定义或不在范围内

来自分类Dev

Haskell:数据/类型构造函数不在范围内,但数据构造函数在范围内

来自分类Dev

为什么会收到“不在范围内”异常消息?

来自分类Dev

Haskell'showInt'不在范围内:为什么不呢?

来自分类Dev

为什么if语句不在全局范围内寻找变量

来自分类Dev

为什么会收到“不在范围内”异常消息?

来自分类Dev

为什么项目不在视图范围内?

来自分类Dev

为什么我不能在基于for的范围内使用此“ void”类型?

来自分类Dev

模板模板参数不在范围内

来自分类Dev

为什么不能对通配符使用多个类型参数?

来自分类Dev

为什么这不在范围内?为什么要使用严格阻止呢?

来自分类Dev

为什么我们将String数组作为参数传递给main()方法,为什么没有任何集合类型或包装器类型或原始类型呢?

来自分类Dev

恼人的警告:整数常量不在枚举类型'UIViewAnimationOptions'的范围内

来自分类Dev

用户定义类型的Show的Haskell实例-构造函数不在范围内

来自分类Dev

Yesod不在范围内:类型构造函数或类Form错误

来自分类Dev

Yesod 静态文件类型安全路由变量不在范围内

来自分类Dev

定义“w”的类型时出现“变量不在范围内:w :: Integer”错误

来自分类Dev

不在范围内:<*>

来自分类Dev

不在范围内

Related 相关文章

  1. 1

    类型参数T#1不在类型变量T#2的范围内

  2. 2

    类型参数T#1不在类型变量T#2的范围内

  3. 3

    为什么“变量不在范围内”

  4. 4

    为什么`char`数据类型中的数据溢出会导致将值包装在其范围内?

  5. 5

    通用二进制搜索树Java类型参数不在范围内

  6. 6

    类型参数“ S”的推断类型“ S”不在其范围之内,为什么?

  7. 7

    类型名称`int`未定义或不在范围内

  8. 8

    包对象中定义的类型不在范围内

  9. 9

    泛型;类型实参不在其范围内

  10. 10

    包对象中定义的类型不在范围内

  11. 11

    类型名称`int`未定义或不在范围内

  12. 12

    Haskell:数据/类型构造函数不在范围内,但数据构造函数在范围内

  13. 13

    为什么会收到“不在范围内”异常消息?

  14. 14

    Haskell'showInt'不在范围内:为什么不呢?

  15. 15

    为什么if语句不在全局范围内寻找变量

  16. 16

    为什么会收到“不在范围内”异常消息?

  17. 17

    为什么项目不在视图范围内?

  18. 18

    为什么我不能在基于for的范围内使用此“ void”类型?

  19. 19

    模板模板参数不在范围内

  20. 20

    为什么不能对通配符使用多个类型参数?

  21. 21

    为什么这不在范围内?为什么要使用严格阻止呢?

  22. 22

    为什么我们将String数组作为参数传递给main()方法,为什么没有任何集合类型或包装器类型或原始类型呢?

  23. 23

    恼人的警告:整数常量不在枚举类型'UIViewAnimationOptions'的范围内

  24. 24

    用户定义类型的Show的Haskell实例-构造函数不在范围内

  25. 25

    Yesod不在范围内:类型构造函数或类Form错误

  26. 26

    Yesod 静态文件类型安全路由变量不在范围内

  27. 27

    定义“w”的类型时出现“变量不在范围内:w :: Integer”错误

  28. 28

    不在范围内:<*>

  29. 29

    不在范围内

热门标签

归档