问题标签 [type-bounds]

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.

0 投票
3 回答
692 浏览

java - 泛型:编译器似乎无法识别传递给参数的类型与返回的类型相同 - 为什么?

假设我有几个 POJO,它们都扩展了一个共同的超类型,BaseObject.

我有一个GenericDao声明为public interface GenericDao<T>.

对于每个特定类型的 DAO,我都有一个接口,它扩展了泛型类型并将其限制为具体类型 ( public interface UserDao extends GenericDao<User>),然后是特定类型 DAO 的实现。

在一个尝试使用多种GenericDao实现的类中,我有一个看起来像的方法

如果我实现getDao()它的参数是一个Class对象,例如

getDao(object.getClass()然后方法中的调用create()无法编译 - 编译器似乎将返回类型解释getDao()

而不是认识到这getDao(Class<T>)会返回给我一个GenericDao相同的类型T

有人可以解释这是为什么吗?我了解重复出现的相同类型绑定或通配符不一定指相同类型;然而,编译器似乎应该从签名中识别出getDao(Class<T>)传入的 T 应该与返回的 T 相同(但显然它无法识别这一点,为什么是我无法掌握的部分)。

如果我改为将getDao的签名定义为

create()那么编译一个看起来像的实现就没有问题了

那么为什么编译器能够在这种情况下识别T传递给的参数在返回类型中getDao(T)是相同T的,而当参数是时它无法识别Class<T>呢?

0 投票
1 回答
809 浏览

generics - 如何在 Scala 中的泛型类型上指定 Float 和 Double 的类型绑定?

我正在编写一些简单的 Vector 和 Matrix 类。它们看起来像这样:

如果我继续使用其他方法和类,如 Point3f/d、Vector4f/d、Matrix3f/d、Matrix4f/d ......这将是很多工作。呃...所以我认为泛型可以在这里提供帮助并从我的代码库中删除冗余。我想到了这样的事情:

这个想法是 scala 编译器为 Vector3[Float] 和 Vector3[Double] 生成专门的类,就像 C++ 模板所做的那样。不幸的是,我必须在类 Vector3 的类型参数 [T] 上设置一些类型,以便在 T 上定义运算符 +。我的问题:如何编写 Vector3[Float] 使其具有与 Vector3f 相同的性能特征?上下文:我想在碰撞检测代码中使用 Vector3f / Vector3d 类......所以性能对我来说很重要。

0 投票
2 回答
1055 浏览

scala - 在 Scala 中使用协方差表示法或通用边界时

在 Scala 中,可以使用泛型类型参数上的 + 和 - 等方差运算符来定义方差。例如,List类型在标准库中是协变的。

因此,可以像这样定义具有协变列表的函数:

方差也可以用通用边界来模拟。所以我们也可以这样写

当然这没有意义,因为list已经是协变的。但同样的技巧也可以用于非协变的类型。(如Stack)。当然,也可以从协变的堆栈(聚合的继承)创建新类型。

所以我的问题:

  1. 什么时候应该对方差使用通用界限?我们什么时候应该创建一个新的协变类型?
  2. 通用边界是否仅对方差有用,或者它们可以声明更多(语言概念)。
  3. 如果它们仅对方差有用,那么边界是否仅用于与 Java 兼容?

提前谢谢:)

0 投票
1 回答
1342 浏览

c# - 从 ComboBox 派生的类型绑定自定义 ComboBox

我应该通过在我的 WinForms 应用程序中从 ComboBox 派生一个类来创建一个自定义 ComboBox。我以前从未这样做过,也无法从谷歌找到很多好的例子。

我需要派生一个自定义组合框,以便我可以将自定义组合框类型绑定到特定对象。

你能指出我正确的方向吗?

这就是我到目前为止所拥有的。

自定义组合框.cs

我有一些具体的问题:

  1. 我需要重写哪些方法?
  2. 如何在我的 VS2010 设计器模式下使用它?
0 投票
4 回答
2295 浏览

scala - 如何在 Scala 中设置多个 ORed 类型边界

是否可以在Scala中做这样的事情:

也就是说,类型A可以是 aStringInt。这可能吗?

(这里有类似的问题)

0 投票
1 回答
578 浏览

scala - 类型构造函数的类型边界中的下划线

有人可以解释为什么以下内容无法编译吗?我想那BB[A]也是一个List[A]。方法主体仅强制执行此视图。

0 投票
2 回答
4692 浏览

scala - Scala 类型上限和父类

我真的很喜欢使用类型上限来为我的构造提供一些灵活性。但是,我真的不知道它背后的任何原理,正如我在以下代码中发现的那样:

我试图让我的类可以使用一个子类,Service只要它是一致的。但是,这不起作用:

我认为,问题在于我如何(以及何时?)定义libraries,好像我进行了以下更改,一切都成功编译:

如何声明一个librariesHashMap 以使其具有多个Library具有不同Services 的 s?可以参考Service这里还是那不可能?

还是我完全在错误的树上吠叫?谢谢!

0 投票
2 回答
929 浏览

arrays - Scala:如何指定暗示相等的类型参数边界?

不要被冗长的文字吓到,这些要点很简单,但需要一些代码来说明问题。:-)

设置:

假设我想创建一个特征,这里被建模为Converter某种类型的,它本身是通用的,但有一个类型化的方法convert(),它返回一个适当类型化的结果对象,比如 a Container[T]

我的问题是关于方法的类型约束,特别是对于强制平等,并且有两个密切相关的部分。

第 1 部分:现在说有一种特别适用于基于数组的内容的专用容器类型,如下所示:

鉴于这种可能性,我现在想将 Converter 特别是convert()方法的返回类型专门化为专门的Container.ForArrays类型:

这样我就可以做这样的事情:

基本上我希望 Scala,如果已知转换器的类型是,也可以推断出asConverter.ForArrays的专门返回类型,即匹配的容器类型加上输入的数组类型。这是可能的吗?如果是这样,我该怎么做?例如,我如何在 convert() 上指定类型参数/边界(提供的只是一个替身——我不知道该怎么做)。哦,当然它仍然会覆盖它的超级方法,否则什么也得不到。convert[Char]()Container.ForArrays[Char]

第 2 部分:作为后备,如果这不可能,我当然可以将 convert 函数下推到以数组为中心的变体中,如下所示:

好的。现在说我有一个更专业Converter.ForArrays.SetBased的,可以在内部使用一组 E 类型的元素(与“输入”数组元素类型相同)在转换期间执行一些特定的魔法。然而,该集合现在是 trait 的一个参数,如下所示:

同样,这是关于 convert() 方法的类型参数。这里的难点是:我如何将类的类型参数 - F- 与方法的类型参数 - E- 使 Scala 编译器只让用户调用convert()其元素与集合元素匹配的数组?例子:

0 投票
2 回答
268 浏览

scala - 类型推断器如何在 reduceLeft 上工作?

除了我的另一个问题之外,onreduceLeft的签名是reduceLeftSeq

我们可以用诸如

在此示例A中是Int,因此reduceLeft需要 Function2[B >: Int, Int, B]. 不管 reduceLeft 是如何工作的(这无关紧要),类型推断器如何知道B有一个+方法,什么时候它可能是 type Any

0 投票
1 回答
108 浏览

function - Scala by Example - 类型边界参数化函数编译器抱怨

我想根据本书第 72 页的 excersize 实现一个类型参数化的函数(使用过滤器实现 forall):

但是,编译器(2.9.1)抱怨类型 A 未定义。显然不应该这样,因为同一本书中的多个示例都使用这种语法。该问题可以通过将函数类型参数更改为[A, B <: A]. 我是不是做错了什么,还是又是 Scala 语法规范的一个巨大变化?如果是这样,坦率地说,我厌倦了在每一秒的练习中用如此愚蠢的问题轰炸 SO。谁能推荐一本清楚地反映当前事物秩序的书?