首页 > 其他分享 >泛型协变

泛型协变

时间:2023-08-29 15:47:07浏览次数:43  
标签:co BeverageDispenser juice self dispenser beverage 协变 泛型

from typing import TypeVar, Generic

class Beverage:  ❶
    """任何饮料"""

class Juice(Beverage):
    """任何果汁"""

class OrangeJuice(Juice):
    """使用巴西橙子制作的美味果汁"""

T = TypeVar('T')  ❷

class BeverageDispenser(Generic[T]):  ❸
    """一个参数化饮料类型的自动售货机"""
    def __init__(self, beverage: T) -> None:
        self.beverage = beverage

    def dispense(self) -> T:
        return self.beverage

def install(dispenser: BeverageDispenser[Juice]) -> None:  ❹
    """安装一个果汁自动售货机"""


juice_dispenser = BeverageDispenser(Juice())
install(juice_dispenser)

orange_juice_dispenser = BeverageDispenser(OrangeJuice())  #类型检查会报错,不支持子类
install(orange_juice_dispenser)

orange_juice_dispenser = BeverageDispenser(Beverage())  #类型检查会报错,不支持父类
install(orange_juice_dispenser)


# 修改为
T_co = TypeVar('T_co', covariant=True)  ❶#支持协变,支持子类,不支持父类
# T_co = TypeVar('T_co', contravariant=True) # 支持逆变,支持父类,不支持子类


class BeverageDispenser(Generic[T_co]):  ❷
    def __init__(self, beverage: T_co) -> None:
        self.beverage = beverage

    def dispense(self) -> T_co:
        return self.beverage

def install(dispenser: BeverageDispenser[Juice]) -> None:  ❸
    """安装一个果汁自动售货机"""

标签:co,BeverageDispenser,juice,self,dispenser,beverage,协变,泛型
From: https://www.cnblogs.com/weiweivip666/p/17664961.html

相关文章

  • Gson读取json字符串中结果需要转泛型的情况解决方案
    原始代码:Gsongson=newGson();ArrayList<Fld>fixed=gson.fromJson(newFileReader(headFilePath),ArrayList.class);for(Fldfld:fixed){intfld_len=fld.getFld_len();}错误显示:com.g......
  • 通过重载签名来实现泛型不易实现的写法
    问题:实现一个TS方法,多个字符转或者多个数字相加首先会想到用泛型实现例如letsum=<T>(a:T,b:T):T=>a+b 但是这样会报“运算符+不可用于类型T”接下来我们可能会想到给类型T加上限制typeSunType=string|number;letsum=<TextendsSunType>(a:T,......
  • Java中的泛型概念
    在Java中,泛型是一种强类型检查机制,它允许我们在编译时期指定类、接口或方法的参数和返回值类型。使用泛型可以实现代码的重用性、类型安全性和提高代码的可读性。下面是关于Java泛型的一些重要概念和用法:泛型类(GenericClass):通过在类名后面使用尖括号<T>来声明一个泛型类,在类......
  • 数据变更事件,泛型类,体会其中思想
    数据变更事件namespaceFeng.FramWorkDesign{publicclassBindableProperty<T>whereT:IEquatable<T>{privateTmValue=default(T);publicTValue{get{returnmValue;}......
  • typeScript学习-泛型
    typeScript学习泛型为什么要用泛型?泛型定义。泛型在类中的应用?封装一个面向对象的ArrayList类。泛型默认值。泛型约束。泛型在Vue3源码中的应用。exendskeyof+keyof的联合应用。泛型反向赋值。具有以下特点的数据类型叫泛型:特点一:定义时不明确使用时必须明确成某......
  • 使用RestTemplate 接收请求返回值中的泛型
    现有一个请求返回值的格式为:{ "success":true, "message":"", "code":200, "result":{ "returnCode":"03AD", "returnMsg":"AD3", "qrcode":"https://xxxxx......
  • c#泛型
    泛型是什么我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样。但我们没有办法,只能分别写多个方法来处理不同的数据类型。这个时候,那么问题来了,有没有一种办法,用同一个方法来处理传入不同种类型参数的办法呢?泛型的出现就是专门来解决这个问题的。使用......
  • delphi泛型实现的变体记录
    delphi泛型实现的变体记录typeTRes=record//公共的JSON回复status:Integer;message:string;exception:string;end;TData<T:record>=recorddata:arrayofT;end;TDatas<T:record>=recordres:TRes;......
  • 泛型
    1.表示类publicclassDemo1<T>{privateTvalue;//泛型方法public<T>voidfun(Tx){System.out.println();}}2.表示接口publicinterfaceDemo2<T>{publicTfun();}3.泛型通配符publicstaticvoidmain(String[]args)......
  • Feign接口返回值加多层泛型,但没有反序列化彻底
    1、问题描述接口返回值加多层泛型,但没有反序列化彻底2、问题原因jackson-databindjar包版本的问题我们之前用的是2.11.2,这个版本有bug,版本变成2.11.3就好了......