问题标签 [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.

0 投票
1 回答
191 浏览

java - 原始类型和子类型

考虑以下代码:

我阅读了“什么是原始类型,我们为什么不应该使用它? ”主题。因此,如果我们有一个参数化类型MyClass<T>,那么通过定义原始类型,我们可以MyClass m在编译时定义对原始类型的引用。MyClass此外,与给定参数化类型相对应的原始类型MyClass<T>MyClass<E> 在编译时对所有特定类型进行类型擦除之前的超类E。这个理由对吗?

0 投票
2 回答
1541 浏览

java - 在java中调用动态构造函数?

假设我有 4 个类 :AB和whereSA和。SBB extends ASB extends SA

A具有以下构造函数:

显然,当我调用类的构造B函数B extends A 时,A也调用了类的构造函数。但在这种情况下,我希望构造函数Ato doa = new SB();而不是a = new SA();.

有没有一种简单的方法可以在不改变和的公共接口的情况下做到这A一点B

0 投票
1 回答
3101 浏览

scala - Scala UpperBound 和 LowerBound 概念

下面是我试图运行的代码:

printStudentDetails来自的方法MyGenericClassforLowerBound正在制造问题。陈述student.printDetailsstudent.printSomeOtherDetails告诉我

据我了解:

  • Q[A <: B]表示类/方法Q可以采用类的任何对象,A其中 ClassA是 class 的子类型B。这称为上限。
  • Q[A >: B]表示类/方法Q可以采用类的任何对象,A其中 ClassA是 class 的超类型B。这称为下限。

如果我的理解有误,请帮助我,并帮助我理解为什么会出现上述问题。多谢你们。

0 投票
3 回答
264 浏览

java - 子类型覆盖方法中的 Java 超级方法调用

有人可以解释一下为什么如果我运行这段代码输出是 [4, 2]:null 而不是 [4,2]: Purple?我的理解是问题出在超类中的 toString 方法中。实际上,如果我从 SuperClass 中的 toString 中删除“final”并编写一个 toString 方法,例如

在子类中一切正常。但我并不真正理解其背后的概念。是否存在一些可以阅读的内容?

感谢您的时间。

ColorPoint.java:

0 投票
3 回答
177 浏览

c++ - C++中的多态子类型

我对 C++ 很陌生,我需要澄清从 Java 移植一个项目。

在Java中,我可以用泛型声明一个基类及其派生类,方法是:


这使我能够:

  1. 在派生类中,我可以使用指定派生类的方法和变量(例如serverName/ clientNamein CentralNetwork/ PeripheralNetwork),而不仅仅是基类的

  2. 派生类是倾斜的,因此编译器/编辑器可以在代码编辑期间向我建议每个方法和变量

  3. 我被迫使用从基类(GenericNetwork/ GenericHost)派生的类,每个错误都在编译时而不是运行时

  4. 每个使用泛型的方法/变量都将在派生类中被视为子类而不是基类(例如,在 中CentralNetworkgetMasterHost将返回派生类,而MyServer不是基类GenericHost)。

我想知道 C++ 中是否存在类似的东西。我已经在寻找模板、继承和子类型,但是我找不到像在 Java 中那样做更聪明的事情的方法。我希望我错过了什么...

编辑:这是我在 C++ 中尝试的:

我现在没有 C 项目,所以我在运行中重写了它,抱歉有任何错误......

0 投票
1 回答
392 浏览

java - Java:在子类型中指定泛型类型限制

我对 Java 中的泛型类型有疑问。具体来说,目前我有一些类似这样的代码:

问题是,编译器现在抱怨说我没有在我的 FooImpl 类中实现 bar 方法。

我想要的是对泛型类型施加一些额外的限制,特别是它们应该具有可比性。但我不想把这个限制放在我的 Foo 接口中,因为所有实现都不需要这个限制。这可能吗,我应该怎么做才能解决它?

提前非常感谢!

编辑 1:修正了拼写错误类 --> 类和接口 --> 接口。但是返回类型仍然是无效的,而不是 T,这是无关紧要的,我想。我的实际返回类型是布尔值。

编辑2:实际代码,按要求:

0 投票
1 回答
682 浏览

list - 通过灵活类型的异构列表

我试图在list使用灵活类型时坚持异构类型

在上面的例子中

产生错误

错误 FS0670:此代码不够通用。类型变量 'a 无法泛化,因为它会超出其范围。

如果已经发布了类似的问题,我们深表歉意。谢谢你。

0 投票
2 回答
1291 浏览

java - 逆变方法参数类型

wiki Contravariant_method_argument_type说覆盖方法具有子类型规则作为函数类型,但是除了一种语言之外没有一种语言支持逆变参数类型。我也无法想出任何使用它的好处的想法。

例子:

我的问题是:

  1. 重写方法的逆变参数类型是否有用?如果是,它在哪里?
  2. 方法是函数吗?为什么 Scala 对函数类型和覆盖方法类型有不同的规则?
0 投票
1 回答
62 浏览

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,所以我们得到编译器错误。

我确信使用通配符可以解决这个问题,但我无法弄清楚它是什么。

您可以编译以下内容以获得相同的错误:

0 投票
1 回答
61 浏览

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 类型的对象???这是什么 ?

这背后的原理是什么。有人可以解释一下吗?