首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么泛型setter会破坏类型协方差,即使它是受约束的?

泛型setter会破坏类型协方差,即使它是受约束的,是因为泛型setter方法可以接受不同类型的参数,而不仅仅是泛型类型的参数。这导致了类型的不确定性,违背了类型协方差的原则。

类型协方差是指在继承关系中,子类型可以替代父类型的规则。例如,如果有一个Animal类和一个Dog类,Dog是Animal的子类,那么可以将一个Dog类型的对象赋值给Animal类型的变量。这是因为Dog是Animal的特殊情况,可以完全替代Animal。

然而,当使用泛型setter时,由于它可以接受不同类型的参数,可能会出现以下情况:

  1. 参数类型与泛型类型不匹配:如果setter方法的参数类型与泛型类型不匹配,就会破坏类型协方差。例如,如果有一个泛型类Box<T>,其中有一个setter方法set(T value),但是在使用时传入了一个不匹配的参数类型,如set("string"),这将导致类型不匹配的错误。
  2. 参数类型是泛型类型的子类型:即使参数类型是泛型类型的子类型,也会破坏类型协方差。因为泛型setter方法可以接受不同类型的参数,如果传入的参数类型是泛型类型的子类型,那么在使用时可能会出现类型转换错误或其他不一致的问题。

综上所述,泛型setter会破坏类型协方差,即使它是受约束的,因为它可以接受不同类型的参数,导致类型的不确定性和不一致性。在开发中,应尽量避免使用泛型setter,以确保类型的一致性和安全性。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift5.7: 类型支持带尖括号扩展绑定

上对参数声明限制,允许通过来声明约束参数。...提议动机在 Swift 语言中,基本到处可见使用在类型名称后面声明绑定类型。...语法糖方式extension [String] { ... }设计细节扩展类型名称可以由尖括号中,隔开类型参数列表组成。 类型参数列表将类型类型参数绑定到每个指定类型参数。...,这个类型也就变得不受约束,而且Pair在不同上下文,也意味不同表达,完全不受控制。...类型参数查找是在扩展上下文之外进行,所以类型参数是不能出现类型参数列表中。因为类型参数在上下文中,无法代表一个准确类型。比如Element。

1.3K20

.NET静态代码织入——肉夹馍(Rougamo)发布2.0

需要首先声明是,和static一样,在不声明时匹配全部,也就是既匹配非类型也匹配类型,如果希望仅匹配非类型或仅匹配类型时需要额外定义,相关定义使用表示。...>,使用两个点..表示匹配任意多个任意类型 匹配指定数量任意类型:a.b.C,示例表示匹配三个任意类型,每添加一个,表示额外匹配一个任意类型,你可能已经想到了a.b.C表示匹配一个任意类型...开放式与封闭式类型:未确定类型称为开放式类型,比如List,确定了类型称为封闭式类型,比如List,那么在编写匹配表达式时,如果希望指定具体,而不是像上面介绍那种任意匹配...*(TA,int,TB))"; } 方法:除了类可以定义参数,方法也可以定义参数,方法参数与类型参数使用方法一致,就不再额外介绍了 // 比如我们有如下类型 public...,对于封闭式类型,直接使用类型全名称即可;对于开放式类型,我们遵守以下规定,从T1开始向后增加,即T1/T2/T3...

21120

尝试Java,从入门到Kotlin(上)

由于Checked Exception是类型系统一部分,一个不抛出异常函数和一个抛出异常函数,它们类型是不相同。这就导致了JavaLambda用性大大减少而且不是很好用。...另一方面,编译器也无法检测出是否可能抛出RuntimeException。无论采用哪种方案,都使得这个Lambda函数变得没那么好看。 Java原理和C#不同。...C#是运行时,在程序运行时候仍然能获取类型信息。而Java类型擦除(Type Erasure)式。...名称听起来很高大上,意思是Java仅仅用于编译时类型检查,类型检查完成后,类型信息就被编译器擦除。在最后生成字节码中中,类型都被改为Object类型。...因此,应该将字段访问封装方法中,即使只是很简单访问和设置,也应该实现getter方法和setter方法。

13030

【译】尝试使用Nullable Reference Types

Preview7Nullable引用类型有哪些新功能 该功能最重要就是补充了用于处理和更高级API使用场景工具。这些源于我们注解.NET Core经验。...这是我们添加一些新属性以允许您在编译器中进行可空分析影响地方。 T?问题 你想知道:为什么在指定可以用可空引用或值类型替换类型时“只”允许T?。不幸是,答案很复杂。 通常T?...意味着“任何可以为空类型”。同时这意味着这T将意味着“任何非可空类型”,这不是真的!今天可以用可空值类型替换T (例如bool?)。这是因为T已经是一个不受约束类型。...语义这种变化可能是意料之外,并且对于T用作无约束类型大量现有代码而言会引起一些悲痛。 其次,有一点非常重要就是,要注意可空引用类型和可空值类型是不一样。...您可能希望在一个方向上允许可以为空类型(例如,仅作为输入或输出),并且不可以用notnull或t和t?表达。除非人为地为输入和输出添加单独类型,否则就需要拆分。

3.7K10

笔记——Android零碎知识摘录(一)

java内省:内省基于反射实现,主要用于操作JavaBean,通过内省 可以获取beangetter/setter,只要看到有getter或者setter就认为这个类有那么一个字段,比如看到getName...6、: “ ? ”是通配符,泛指所有类型:一般用于定义一个引用变量,这么做好处是,如下所示,定义一个sup引用变量,就可以指向多个对象。 SuperClass<?...运用地方有点不同,?是定义在引用变量上,T是类上或方法上;如果有方法和非方法,都满足条件,执行非方法。 带不同ArrayList在编译后生成Class是相同!...也就是说,在编译生成字节码文件时会被”擦除”;不管ArrayList带什么,在编译后都是ArrayList所对应字节码文件。 eg: ?...擦除.png 7、Activity生命周期 ? activity.png

37120

C#4.0新增功能03 协变和逆变

类型参数支持协变和逆变,可在分配和使用类型方面提供更大灵活性。 在引用类型系统时,协变、逆变和不变性具有如下定义。...在调用类型 Action 委托(就像它是类型 Action委托一样)时,其参数必须属于类型 Derived。...Func 委托最后一个类型参数指定委托签名中返回值类型。 该参数是协变(out 关键字),而其他类型参数是逆变(in 关键字)。 下面的代码阐释这一点。...委托类型参数中协方差和逆变效果类似于普通委托绑定中协方差和逆变效果(请参阅委托中差异 (C#) 和委托中差异 (Visual Basic))。...然后,使用类型参数协变和逆变,将得到委托指派给另一个变量,此变量委托类型参数类型为 Type3 ,返回类型为 Type1。

1.3K20

Dart语言指南(二) 顶

按照惯例,类型变量具有单字母名称,例如: E, T, S, K, 和 V. 为什么要用? 因为Dart中类型是可选,所以您不必使用 ....,值为View类型map集合: var views = new Map(); 集合及其包含类型 Dart类型被 修改, 意味着会附带类型信息....Note: 相比之下,Java中使用擦除,这意味着类型参数在运行时被删除。 在Java中,您可以测试对象是否为List,但是不能测试它是否为 List....限制参数化类型 实现类型时,可能需要限制其参数类型。...中介绍了方法新语法。 如果使用方法,请选用 SDK版本为1.21或更高版本. 关于更多信息, 参阅 Dart中可选类型 和 使用通用方法.

3K20

年后跑路第一战,从Java学起!

本文章是对 Java 中快速介绍,包含背后目标以及使用如何提高我们代码质量。 为什么要引入?...即使该方法返回 void,这也是必需。 如前所述,该方法可以处理多个类型。在这种情况下,我们必须将所有类型添加到方法签名中。...列表,即使 House 是 Building 一个子类型。...super T> 表示未知类型它是 T 超类(= T 及其所有父类)。 类型擦除 Java 中添加了以确保类型安全。...并且为了确保不会在运行时造成开销,编译器在编译时对应用了一个称为类型擦除过程。 如果类型参数是无界,则类型擦除删除所有类型参数并用它们边界或Object替换它们。

68930

(35) (上) - 基本概念和原理 计算机程序思维逻辑

Java虚拟机实际执行时候,它是不知道这回事,它只知道普通类及代码。...好处 既然只使用普通类和Object就是可以,而且最后也转换为了普通类,那为什么还要用呢?或者说,到底有什么好处呢?...); String name = pair.getSecond(); 开发环境如Eclipse提示你类型错误,即使没有好开发环境,编译时,Java编译器也提示你。...numbers.add(new Double(12.34)); 那最后一行就是合法,这时,DynamicArray中就会出现Double类型值,而这,显然就破坏了Java关于类型安全保证...在Java中,是通过类型擦除来实现它是Java编译器概念,Java虚拟机运行时对基本一无所知,理解这一点是很重要,它有助于我们理解Java很多局限性。

73780

Domain Escalation: Unconstrained Delegation

委派介绍 Kerberos委派使服务能够模拟计算机或用户以便使用用户特权和权限参与第二个服务,为什么委派是必要经典例证呢,例如:当用户使用Kerberos或其他协议向web服务器进行身份验证时,服务器希望与...SQL后端或文件服务器进行交互 Kerberos委托类型: 不受限制委托 受约束委托 RBCD(基于资源受限委派) SPN介绍 Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联...,这允许客户端应用程序请求服务对帐户进行身份验证,即使客户端没有帐户名 无约束委派 该功能最初出现在Windows Server 2000中,但为了向后兼容它仍然存在,如果用户请求在具有不受约束委托服务器集上服务服务票据时...很明显我们需要在启用了委托机器上运行我们攻击,所以我们假设攻击者已经入侵了一台这样机器 假设1:攻击者破坏了运行IISDC1$系统Kerberos身份验证 假设2:攻击者有权访问加入域系统(这里是在该系统上运行...,安全漏洞使得微软引入了受约束委托,您将在下一篇文章中读到更多相关内容,感谢阅读

77420

TypeScript 官方手册翻译计划【十二】:类

对于访问器,TypeScript 有一些特殊推断规则: 如果 get 存在而 set 不存在,那么属性自动成为只读属性 如果没有指定 setter 参数类型,那么基于 getter 返回值类型去推断参数类型...关于 C# 为什么认为这段代码是不合法,可以阅读这篇文章了解更多信息:为什么我无法在一个派生类中去访问一个受保护成员?...#count += lastInstances.length; } catch {} } } 类 类和接口一样,也可以使用。...当用 new 实例化一个时候,它类型参数就像在函数调用中那样被推断出来: class Box { contents: Type; constructor(value...静态成员永远都不能引用类类型参数。 类运行时 this 有个要点需要记住,那就是 TypeScript 不会改变 JavaScript 运行时行为。

2.5K10

TypeScript 4.7 beta 发布:NodeJs ES Module 支持、新类型编程语法、类型控制流分析增强等

在 4.6 版本前,你可以通过或额外类型守卫方式来显式纠正类型地控制流分析,而在 4.6 版本中,对于可辨识联合类型分析得到了优化,上面的代码类型现在能够被正确地推导。...TypeScript 能够从 produce 函数返回值推导出参数 T 类型,并应用到 consume 函数入参类型中。...实例化表达式 Instantiation Expressions 毫不夸张说,实例化表达式是本次更新我最期待功能之一,它支持了对预填充而无需实际调用。...SetterSetter之间类型兼容性是如何?...类型参数兼容性,现在在启用 strictNullChecks 情况下,无默认值参数不能分配给类型 {}。

5.8K30

更深入地理解Java

引言 jdk5.0中引入了Java,目的是减少错误,并在类型上添加额外抽象层。 本文将简要介绍Java中背后目标以及如何使用来提高代码质量。 2....这种转换可能令人感到聒噪,我们明明知道这个列表中数据类型是整数。转换的话,也把我们代码搞得乱七八糟。如果程序员在显式转换中出错,则可能导致抛出与 类型相关运行时错误 。...即使方法返回是void,也需要这样做。...super T>表示未知类型它是 T(=T及其所有父类)超类。 5....为了理解原始数据类型为什么不起作用,只需记住 是编译时特性,这意味着类型将会被擦除,所有类型都实现为 Object 类。

99030

【Rust 研学】Rust Nation UK 2024 | Rust ABI 稳定之路

在二进制级别,crate 之间泄漏实现细节。比如,如果一个字段是私有的,仍然可以按值来移动它。另外,内联函数和工作方式是在编译时分发到不同 crate 中。 其他语言怎么稳定 ABI ?...所以,crate A 中其实并不知道 crate B 中通过哪些具体类型来使用它。 对于 稳定 ABI 来说,这也是一个挑战。...因为当 crate A 里发生变化,crate B 代码遭到破坏。 对这个问题解决方案是:多态化(Polymorph)。只需要创建一个可以处理任何类型单个函数。...该函数将类型描述符作为参数。 对于 trait 限定来说,需要一种 trait 描述符。 trait 描述符更加复杂,包含关联类型、关联常量和方法等更复杂元素。...比如你不能简单地内联迭代器 map 方法,很可能导致 rust 程序性能被破坏。 “map 是方法,可能被多次调用,或者可能被传递到其他上下文中。

10510

Getter & Setter:使用还是废弃

私有变量 为什么我们要使用私有的实例变量呢? 因为我们不希望其他类直接依赖于这些变量。而且在心血来潮时,我们还可以灵活修改变量类型和实现。...这就是这个规则一个例外,因为仅仅说它是一个属性更加简单和安全。我们退一步想一想:既然这样,为什么要这条规则呢?它是否适用呢?在这个例外中,它并不适用。 私有属性 + 公共存取方法 == 封装?...考虑下面的例子 我们通常都认为以上是糟糕代码风格,因为它破坏了封装性。替代方法是: 有人认为这样封装了属性。这真的实现了封装吗? 实际上,Getter/Setter和封装性没有任何关系。...其他类对这个类内部细节仍然了如指掌。 类改动可能蔓延,迫使依赖它其他类做出相应修改。以这种方式使用Getter和Setter通常破坏了封装性。...让我们看看另一个例子 依据以上逻辑,假设我们随后认为数据类型double不够合适,而是应该使用BigDecimal,这样那些已经使用了这个类客户端代码也失效。

1.2K60

那些年我们在Java上躺过枪---万恶擦除【享学Java】

方法声明和声明略有不同,它是在返回类型之前用尖括号列出类型参数列表(也可以有多个类型),而函数传入形参类型可以利用来表示。...粗细粒度需要控制好~ 擦除 前面指出了,Java是假它是编译期。...从上例可以知道,java擦除确实给实际编程中带来了一些不便(特别是运行时反射时,有时候无法判断出真实类型)。那Java设计者为什么要这么干呢?...所以Java使用这么具有局限性实现方法就是从非化代码到化代码一个过渡,以及不破坏原有类库情况下,将融入Java语言。 通配符 和<?...这个也是通过反射完成一些封装框架,比如MyBatis、Redis序列化值、SpringMVC等处理入参值普遍遇到但是无法解决问题 类型可变参数作为入参坑 如下示例: public class

93130

C#中

通过使用,我们可以极大地提高代码重用度,同时还可以获得强类型支持,避免了隐式装箱、拆箱,在一定程度上提升了应用程序性能。本文将系统地为大家讨论,我们先从理解开始。...为什么要有? 我想不论大家通过什么方式进入了计算机程序设计这个行业,都免不了要面对数据结构和算法这个话题。...好吧,我们把题目限定得再窄一些,我们来实现一个最简单冒泡排序(Bubble Sort)算法,如果你没有使用经验,我猜测你可能毫不犹豫地写出下面的代码来,因为这是大学教程标准实现: public...这里我想说是一个有趣编译器能力,它可以推断出你传递数组类型以及它是否满足了约束,所以,上面的SpeedSort()方法也可以像下面这样调用: calculator.SpeedSort(bookArray...); 这样尽管它是一个方法,但是在使用上与普通方法已经没有了任何区别。

1.1K70

Shiro系列 | 《Shiro开发详细教程》第四章:Shiro中Ini配置

但是和一般 IOC 容器区别在于,Shiro 从根对象 SecurityManager 开始导航; Shiro 支持依赖注入: public 空参构造器对象创建; setter 依赖注入; 1....SecurityManager 实例: 默认情况先创建一个名字为 securityManager,类型为 org.apache.shiro.mgt.DefaultSecurityManager 默认...SecurityManager,如果想自定义,只需要在 ini 配置文件中指定 “securityManager=SecurityManager 实现类” 即可,名字必须为 SecurityManager,它是起始根...自动调用 jdbcRealm.setPermissionsLookupEnabled(true),对于这种常量值自动类型转换。...,常量的话都看作字符串(即使也不会自动造型)。

73820
领券