问题标签 [subtyping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 这个 Java 类型层次结构正确吗?
鉴于类型List<?>
、List<Object>
、List<? super Number>
、List<Number>
、List<Integer>
和List<? extends Number>
,我试图理解它们的层次结构。
我知道它List<Integer>
不是 的子类型List<Number>
,即使Integer
它确实是 的子类型Number
,所以我认为它是 的子类型List<? extends Number>
。
但从List<? extends Number>
直觉上看,它似乎是 的子类型,毕竟List<Number>
它是List<Integer>
的后代,正如我的想法所示:List<Number>
那么,如果一个类型是另一个类型的后代,但不是直接的,它是否仍然是其祖先的子类型(或者我在图中只是错了)?这个练习也让我对?
vs.有点困惑Object
......实际上,看起来我可能有List<Object>
并且List<? super Number>
混淆了。我想最大的问题之一是,“‘一切’都是Object
……还是一切都是…… ?
?” 或者两者都有……或者两者都没有?
java - “?扩展 E”和“T 扩展 E”有什么区别?
我是 java 新手,我试图从 Java 泛型和集合一书中理解下面奇怪的语法。(我广泛使用 C++ 模板,因此可以声称了解泛型编程的基础知识和可能的陷阱):
为什么上面不能写成:
有什么不同?仅仅是语言限制还是引擎盖下有什么区别?
c++ - 异常处理和强制
输出:
为什么异常处理对子类型很好,但对强制却不行?
ocaml - 为什么 OCaml 不支持记录子类型化?
阅读“类型和编程语言”,我对使用闭包和记录子类型的对象实现印象深刻(第 18 章)。OCaml 不支持记录子类型是否有任何特殊原因(我知道对象支持)?事实上,我找不到任何支持这一点的语言。
c# - C#中泛型接口之间的子类型化
我有一个“最小状态”类型,其中包含一些数据并且可以生成另一个最小状态实例:
我还有一个“正常状态”,它包含更多数据并且可以生成一个正常状态的实例:
据我所知,IState 应该是 IMinimalState 的子类型。(任何需要 IMinimalState 的东西在获得 IState 时都应该同样高兴)但是,我无法让编译器接受这一点。
例子:
很公平,让我们尝试通用接口:
还没有编译器错误。但State
仍然不是 的子类型MinimalState
,IState<State>
也不是 的子类型IMinimalState<MinimalState>
。我尝试了许多其他组合,但没有成功。
有没有办法制作IState
的子类型IMinimalState
?如果不,
是因为.Net类型系统不够强大吗?
或者,我认为这
IState
真的是 的子类型是错误的IMinimalState
吗?(如果需要的东西IMinimalState
接收到,程序是否会崩溃IState
?)
java - Java中的子类型或泛型?
这是一个 Java 分配问题,可能涉及子类型和泛型。我有一个扩展ArrayList
名为 Rows的类
我需要在另一个类中返回它,该类有一个返回 a 的方法List<List<Thing>>
,因此我需要这样做以获得所需的返回类型:
Eclipse 返回的错误java.lang.ClassCastException: java.util.ArrayList
不能转换为 package.Rows。当我的 Rows 类扩展时,我很困惑,ArrayList
我认为它应该能够被转换为它。
ocaml - 为什么 OCaml 对多态变体使用子类型?
我刚刚阅读了有关行多态性以及它如何用于可扩展记录和多态变体的内容。
然而,Ocaml 对多态变体使用子类型。为什么?它比行多态更强大吗?
java - 泛型定义中的原始类型
我想知道为什么以下通用定义不会产生编译器警告:
以及上述定义与
每当您阅读泛型时,您就会了解如何避免使用原始类型,因此,每当您处理泛型类型时,都会收到编译器警告。然而,第一个定义中的原始类型不会产生这样的警告。
其次,我想知道原始类型和泛型类型之间的确切子类型定义是怎样的。根据此摘要,原始类型是类型检查的一种“选择退出”,因此只要涉及原始类型,类型检查就只是不活动的。这个假设正确吗?这对上述“原始”通用定义有何影响?
感谢您的帮助!
更新:我明白你在说什么。然而,这不是我感到困惑的。看看这个场景:
由于通用约束,不允许第一次调用callWildcard1
to 。callBound1
然而,第二个是允许的。如何在没有“内部原始类型”的情况下执行第一次调用?我不明白为什么编译器会禁止第一个。不应该有任何参数有效的通配符参数暗示? extends MyClass<?>
吗?
更新2:我通过反复试验发现,我可以通过定义来解决问题:
尽管我不太明白为什么。但是,在查看此示例时,还有更多的困惑:(这是我实际尝试做的一个非常简单的版本。)
为什么被genericCall1
禁止而不被禁止genericCall2
?同样,我通过学术猜测而不是真正的理解找到了解决方案。有时,在使用 Java 及其泛型时,我想哭……
c# - 为什么指针类型不是对象的子类型?
为什么语言设计者选择指针类型不是子类型object
(与引用类型和值类型不同)?有没有办法在不使用IntPtr
,UIntPtr
或自定义类的情况下装箱指针?
scala - 避免使用类型成员和子类型进行类型转换
我在路径相关类型和模式匹配方面遇到问题:
这失败了,因为 scalac 不foo
认同b
. 因此,它只适用于两种类型:
当然必须有一种干净的方法来避免演员表?