Delphi泛型支持下限/上限类型边界吗?

10

Delphi是否支持其泛型的lower / upper type bounds,例如Scala可以支持的那样?

我在Embarcadero文档中没有找到相关内容:

此外,在“泛型约束”一章中有一个隐含的提示反对类型边界:

约束项包括:

  • 零个、一个或多个接口类型
  • 零个或一个类类型
  • 保留字"constructor","class"或"record"

您可以为约束指定"constructor"和"class"。 但是,"record"不能与其他保留字组合。 多个约束作为加法并集(“AND”逻辑)。

示例:

让我们来看下面这段Scala代码的行为,它演示了上限类型限制的用法。我在网上找到了这个例子on the net

class Animal
class Dog extends Animal
class Puppy extends Dog

class AnimalCarer{
  def display [T <: Dog](t: T){ // Upper bound to 'Dog'
    println(t)
  }
}

object ScalaUpperBoundsTest {
  def main(args: Array[String]) {

    val animal = new Animal
    val dog = new Dog
    val puppy = new Puppy

    val animalCarer = new AnimalCarer

    //animalCarer.display(animal) // would cause a compilation error, because the highest possible type is 'Dog'.

    animalCarer.display(dog) // ok
    animalCarer.display(puppy) // ok
  }
}

有没有办法在Delphi中实现这样的行为?

我认为你想要的是逆变 - erip
@erip Delphi不支持协变或逆变。 - Stefan Glienke
1个回答

13
在Delphi中,这个例子看起来像下面这样(去除了无关的代码):
type
  TAnimal = class(TObject);

  TDog = class(TAnimal);

  TPuppy = class(TDog);

  TAnimalCarer = class
    procedure Display<T: TDog>(dog: T);
  end;

var
  animal: TAnimal;
  dog: TDog;
  puppy: TPuppy;
  animalCarer: TAnimalCarer;
begin
//  animalCarer.Display(animal); // [dcc32 Error] E2010 Incompatible types: 'T' and 'TAnimal'
  animalCarer.Display(dog);
  animalCarer.Display(puppy);
end.

由于Delphi不支持设置下限,因此无法像您链接的文章中所示进行设置。 Delphi也不支持任何类型的变化。

编辑:值得一提的是,在这种情况下,Display方法甚至不必是通用的,狗参数可以只是TDog类型,因为您可以传递任何子类型。 由于Delphi的通用能力有限,Display方法的通用性并没有好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接