问题标签 [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 - 原始类型和子类型
考虑以下代码:
我阅读了“什么是原始类型,我们为什么不应该使用它? ”主题。因此,如果我们有一个参数化类型MyClass<T>
,那么通过定义原始类型,我们可以MyClass m
在编译时定义对原始类型的引用。MyClass
此外,与给定参数化类型相对应的原始类型MyClass<T>
是MyClass<E>
在编译时对所有特定类型进行类型擦除之前的超类E
。这个理由对吗?
java - 在java中调用动态构造函数?
假设我有 4 个类
:A
、B
和whereSA
和。SB
B extends A
SB extends SA
类A
具有以下构造函数:
显然,当我调用类的构造B
函数B extends A
时,A
也调用了类的构造函数。但在这种情况下,我希望构造函数A
to doa = new SB();
而不是a = new SA();
.
有没有一种简单的方法可以在不改变和的公共接口的情况下做到这A
一点B
?
scala - Scala UpperBound 和 LowerBound 概念
下面是我试图运行的代码:
printStudentDetails
来自的方法MyGenericClassforLowerBound
正在制造问题。陈述student.printDetails
和student.printSomeOtherDetails
告诉我
据我了解:
Q[A <: B]
表示类/方法Q
可以采用类的任何对象,A
其中 ClassA
是 class 的子类型B
。这称为上限。Q[A >: B]
表示类/方法Q
可以采用类的任何对象,A
其中 ClassA
是 class 的超类型B
。这称为下限。
如果我的理解有误,请帮助我,并帮助我理解为什么会出现上述问题。多谢你们。
java - 子类型覆盖方法中的 Java 超级方法调用
有人可以解释一下为什么如果我运行这段代码输出是 [4, 2]:null 而不是 [4,2]: Purple?我的理解是问题出在超类中的 toString 方法中。实际上,如果我从 SuperClass 中的 toString 中删除“final”并编写一个 toString 方法,例如
在子类中一切正常。但我并不真正理解其背后的概念。是否存在一些可以阅读的内容?
感谢您的时间。
ColorPoint.java:
c++ - C++中的多态子类型
我对 C++ 很陌生,我需要澄清从 Java 移植一个项目。
在Java中,我可以用泛型声明一个基类及其派生类,方法是:
这使我能够:
在派生类中,我可以使用指定派生类的方法和变量(例如
serverName
/clientName
inCentralNetwork
/PeripheralNetwork
),而不仅仅是基类的派生类是倾斜的,因此编译器/编辑器可以在代码编辑期间向我建议每个方法和变量
我被迫使用从基类(
GenericNetwork
/GenericHost
)派生的类,每个错误都在编译时而不是运行时每个使用泛型的方法/变量都将在派生类中被视为子类而不是基类(例如,在 中
CentralNetwork
,getMasterHost
将返回派生类,而MyServer
不是基类GenericHost
)。
我想知道 C++ 中是否存在类似的东西。我已经在寻找模板、继承和子类型,但是我找不到像在 Java 中那样做更聪明的事情的方法。我希望我错过了什么...
编辑:这是我在 C++ 中尝试的:
我现在没有 C 项目,所以我在运行中重写了它,抱歉有任何错误......
java - Java:在子类型中指定泛型类型限制
我对 Java 中的泛型类型有疑问。具体来说,目前我有一些类似这样的代码:
问题是,编译器现在抱怨说我没有在我的 FooImpl 类中实现 bar 方法。
我想要的是对泛型类型施加一些额外的限制,特别是它们应该具有可比性。但我不想把这个限制放在我的 Foo 接口中,因为所有实现都不需要这个限制。这可能吗,我应该怎么做才能解决它?
提前非常感谢!
编辑 1:修正了拼写错误类 --> 类和接口 --> 接口。但是返回类型仍然是无效的,而不是 T,这是无关紧要的,我想。我的实际返回类型是布尔值。
编辑2:实际代码,按要求:
list - 通过灵活类型的异构列表
我试图在list
使用灵活类型时坚持异构类型
在上面的例子中
产生错误
错误 FS0670:此代码不够通用。类型变量 'a 无法泛化,因为它会超出其范围。
如果已经发布了类似的问题,我们深表歉意。谢谢你。
java - 逆变方法参数类型
wiki Contravariant_method_argument_type说覆盖方法具有子类型规则作为函数类型,但是除了一种语言之外没有一种语言支持逆变参数类型。我也无法想出任何使用它的好处的想法。
例子:
我的问题是:
- 重写方法的逆变参数类型是否有用?如果是,它在哪里?
- 方法是函数吗?为什么 Scala 对函数类型和覆盖方法类型有不同的规则?
java - 如何使接口扩展与泛型参数兼容?
跟进这个问题,但我会尽量让它自成一体。
假设我有一个名为 的接口Animal
,由于各种原因,它有一个表示实现类的泛型类型参数:
我还有一个子接口 ,Dinosaur
它的行为方式相同:
现在我有一个Lizard
实现的类Animal
:
和一个子类Trex
,它实现Dinosaur
:
这四个声明现在产生错误。这是因为该类Trex
实现了接口Animal
两次,但使用了不同的类型参数:因为它 extends Lizard
,它实现了 interface Animal<Lizard>
,并且因为它 implements Dinosaur<Trex>
,它实现了Animal<Trex>
。
Animal<Trex>
不是 的子接口Animal<Lizard>
,即使Trex
是 的子类Lizard
,所以我们得到编译器错误。
我确信使用通配符可以解决这个问题,但我无法弄清楚它是什么。
您可以编译以下内容以获得相同的错误:
java - 接口和实现类基本原理中的泛型参数化定义
我无法理解与泛型相关的子类型/接口实现背后的概念。请解释。我有以下结构:
我的理解是,任何实现 IProducerConsumer 的具体类都必须包含 T 类型的对象,它是 Number 和 ICommand 接口的子类。
IProducerConsumer<T extends Number,ICommand>
现在想写一个实现类SimpleProducerConsumer,
现在我的意图是我想告诉 SimpleProducerConsumer 可以保存 IProducerConsumer 类型参数中定义的任何类型参数,如下所示:
它不起作用,它说如下:
*绑定不匹配:类型 T 不是该类型的有界参数的有效替代品IProducerConsumer<T,ICommand>*
所以,我的第一个问题是为什么我不能在具体类中定义与接口相同的方式。幕后发生的事情。
如果我能定义
为什么我在实施时不能做同样的事情,令人困惑。
现在我定义如下
IProducerConsumer 中仍然有 T 抱怨。
如果我改变如下:
扩展抱怨说要删除令牌。
现在我这样做如下:
仍然在 IProducerConsumer 中扩展不起作用。
现在
是的,现在编译器很高兴。现在我完全迷路了,上面的东西是什么意思。SimpleProducerConsumer 包含 T 类型的对象,它们是 Number 和 ProducerCommand 对象的子类,但 IProducerConsumer 包含 T 类型的对象???这是什么 ?
这背后的原理是什么。有人可以解释一下吗?