tcga癌症亚型获取_将亚型多态性与通用多态性相关联的危险

tcga癌症亚型获取

Java 5已将通用多态性引入Java生态系统。 即使我们都知道由于泛型类型擦除及其后果而引起的无数警告,这还是对Java语言的重要补充。 通用多态性(也称为参数多态性 )通常与可能预先存在的亚型多态性正交。 一个简单的例子是collections API

List<? extends Number> c = new ArrayList<Integer>();

在上面的示例中,子类型ArrayList被分配给超类型List的变量。 同时,使用Integer类型对ArrayList进行参数化,可以将其分配给兼容的参数超类型? extends Number ? extends Number 。 在通用多态性的情况下,这种子类型多态性的用法也称为协方差 ,尽管当然也可以在非通用上下文中实现协方差。

具有通用多态性的协方差

协方差对于泛型很重要。 它允许创建复杂的类型系统。 简单的示例涉及将协方差与通用方法结合使用:

<E extends Serializable> void serialize(Collection<E> collection) {}

上面的示例接受任何Collection类型,可以在调用站点使用诸如ListArrayListSet等类型对它进行子类型化。 同时,仅要求调用站点上的泛型类型参数是Serializable的子类型。 即它可以是List<Integer>ArrayList<String>等。

将亚型多态性与通用多态性相关联

于是人们常常被引诱去关联两种正交类型的多态性。 这种相关性的一个简单示例是将IntegerListStringSet专门IntegerList

class IntegerList extends ArrayList<Integer> {}
class StringSet extends HashSet<String> {}

这是很容易看到明确的类型的数量会爆炸,如果你开始跨越亚型和泛型类型层次的笛卡尔积,希望通过创建之类的东西更精确地专门IntegerArrayListIntegerAbstractListIntegerLinkedList等。

使相关性通用

从上面可以看出,这种关联通常会从类型层次结构中删除通用性,尽管并不需要这样做。 在以下更一般的示例中可以看出:

// AnyContainer can contain AnyObject
class AnyContainer<E extends AnyObject> {}
class AnyObject {}// PhysicalContainer contains only PhysicalObjects
class PhysicalContainer<E extends PhysicalObject>extends AnyContainer<E> {}
class PhysicalObject extends AnyObject {}// FruitContainer contains only Fruit,
// which in turn are PhysicalObjects
class FruitContainer<E extends Fruit>extends PhysicalContainer<E> {}
class Fruit extends PhysicalObject {}

上面的示例是一个典型的示例,其中API设计者被诱使子类型多态性( Fruit extends PhysicalObject extends AnyObject )与泛型多态性( <E> )相关联,同时保持泛型,从而允许在FruitContainer添加其他子类型。 AnyObjectAnyObject应该知道其自己的子类型时,这会变得更加有趣。 这可以通过递归泛型参数来实现。 让我们修复前面的示例

// AnyContainer can contain AnyObject
class AnyContainer<E extends AnyObject<E>> {}
class AnyObject<O extends AnyObject<O>> {}// PhysicalContainer contains only PhysicalObjects
class PhysicalContainer<E extends PhysicalObject<E>>extends AnyContainer<E> {}
class PhysicalObject<O extends PhysicalObject<O>>extends AnyObject<O> {}// FruitContainer contains only Fruit,
// which in turn are PhysicalObjects
class FruitContainer<E extends Fruit<E>>extends PhysicalContainer<E> {}
class Fruit<O extends Fruit<O>>extends PhysicalObject<O> {}

这里有趣的部分不再是容器,而是AnyObject类型层次结构,该结构将子类型多态与自身类型上的通用多态相关联! 这也可以通过java.lang.Enum完成:

public class Enum<E extends Enum<E>>
implements Comparable<E> {public final int compareTo(E other) { ... }public final Class<E> getDeclaringClass() { ... }
}enum MyEnum {}// Which is syntactic sugar for:
final class MyEnum extends Enum<MyEnum> {}

危险所在?

枚举和我们的自定义之间的细微差别AnyObject层次是事实MyEnum通过被终止的两个正交分型技术递归自相关final ! 另一方面,除非将AnyObject子类型也AnyObject为最终类型,否则不应将其删除。 一个例子:

// "Dangerous"
class Apple extends Fruit<Apple> {}// "Safe"
final class Apple extends Fruit<Apple> {}

为什么final如此重要,或者换句话说,为什么在终止递归自相关(例如Apple之前)时必须小心AnyObject子类型? 这很简单。 让我们假设以下内容:

class AnyObject<O extends AnyObject<O>>implements Comparable<O> {@Overridepublic int compareTo(O other) { ... }public AnyContainer<O> container() { ... }
}

上述关于AnyObject.compareTo()约定意味着, AnyObject任何子类型都只能与同一子类型进行比较。 以下是不可能的:

Fruit<?> fruit = // ...
Vegetable<?> vegetable = // ...// Compilation error!
fruit.compareTo(vegetable);

层次结构中当前唯一可比较的类型是Apple:

Apple a1 = new Apple();
Apple a2 = new Apple();a1.compareTo(a2);

但是,如果我们想添加GoldenDeliciousGala苹果怎么办?

class GoldenDelicious extends Apple {}
class Gala extends Apple {}

我们现在可以比较它们!

GoldenDelicious g1 = new GoldenDelicious();
Gala g2 = new Gala();g1.compareTo(g2);

这不是AnyObject作者的AnyObject

这同样适用于container()方法。 允许子类型协变地专门化AnyContainer类型,这很好:

class Fruit<O extends Fruit<O>>extends PhysicalObject<O> {@Overridepublic FruitContainer<O> container() { ... }
}

但是, GoldenDeliciousGalacontainer()方法会GoldenDelicious

GoldenDelicious g = new GoldenDelicious();
FruitContainer<Apple> c = g.container();

是的,它将返回一个Apple容器,而不是AnyObject设计人员想要的GoldenDelicious容器。

子类型多态和泛型多态跨越正交类型轴。 使它们相互关联可能是类型系统中的设计气味。 使它们在同一类型上关联是危险的,因为很难正确处理。 用户将尝试终止基本类型的子类型上的递归泛型类型定义。 终止的原因是具有递归自绑定的基本类型很难使用的事实。 但是终止通常会出错,因为它只能在final类上执行,而不能在常规类或接口上执行。

换句话说,如果您认为需要基于通用基本类型的递归泛型类型定义,请仔细考虑,如果确实需要,并且您的类型用户可以在final类中正确终止递归泛型类型定义。

参考:来自JACG ,SQL和JOOQ博客的JCG合作伙伴 Lukas Eder提出的将子类型多态与通用多态相关联的危险 。

翻译自: https://www.javacodegeeks.com/2013/07/the-dangers-of-correlating-subtype-polymorphism-with-generic-polymorphism.html

tcga癌症亚型获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在生产中运行Java:SRE的观点

作为站点可靠性工程师 &#xff08;SRE&#xff09;&#xff0c;我确保我们的生产服务高效&#xff0c;可扩展且可靠。 典型的SRE是生产大师&#xff0c;必须对更广泛的体系结构有很好的了解&#xff0c;并精通许多更精细的细节。 SRE是会说多种语言的程序员&#xff0c;这是很…

android 退出多个activity,Android 中 退出多个activity的经典方法

1.使用list集合方式用list保存activity实例&#xff0c;然后逐一干掉import java.util.linkedlist;import java.util.list;import android.app.activity;import android.app.alertdialog;import android.app.application;import android.content.dialoginterface;import androi…

声明jpa批注处理器_如何使用反射基于JPA批注记录您的数据模型

声明jpa批注处理器因此&#xff0c;当您仅可以注释Java类时&#xff0c;使用JPA&#xff0c;Hibernate或EBeans很酷&#xff0c;但是您不是一直希望可以从代码“生成”数据模型的文档吗&#xff1f; 提取JPA / Hibernate和其他验证注释的信息&#xff1f; 假设您的bean中具有所…

在Grails战争中添加“精简” Groovy Web控制台

假设您已将Grails应用程序部署到服务器上–如何查找应用程序的配置方式&#xff1f; 如果您有来源&#xff0c;则可以查看Config.groovy &#xff0c; BuildConfig.groovy等&#xff08;在这种情况下&#xff0c;我正在谈论Grails 2应用程序&#xff0c;但是这些想法可以推广到…

ubuntu生成密钥和证书_基于浏览器的密钥生成以及与浏览器的密钥/证书存储的交互...

ubuntu生成密钥和证书想象以下情况&#xff1a; 您需要从访问您的网站的用户那里获取一个密钥&#xff08;在非对称情况下为用户的公共密钥 &#xff09;&#xff0c;并希望浏览器记住私有部分&#xff0c;而不会因冗长的导入过程而困扰用户。 老实说&#xff0c;实际上&#…

JPA persistence.xml SQL脚本定义

您可以在将在运行时执行的JPA持久性上下文定义中定义并链接到SQL脚本。 有标准化的属性来定义脚本&#xff0c;以分别说明如何创建模式&#xff0c;批量加载数据和删除模式&#xff1a; <persistence version"2.1" xmlns"http://xmlns.jcp.org/xml/ns/persi…

如何使用JPA和Hibernate映射JSON集合

介绍 开源的hibernate-types项目允许您将Java对象或Jackson JsonNode为JPA实体属性。 最近&#xff0c;感谢我们的杰出贡献者&#xff0c;我们添加了对类型安全集合的支持&#xff0c;该集合也可以作为JSON持久化。 在本文中&#xff0c;您将了解如何实现此目标。 Maven依赖 …

android listview mapview,RelativeLayout和并列ListView/MapView

我尝试使用RelativeLayout并排放置ListView和MapView。然而我的MapView总是高于ListView。RelativeLayout和并列ListView/MapView这里是我的main.xml布局&#xff1a;android:orientation"vertical"android:layout_width"fill_parent"android:layout_heigh…

android数据流分类,【Android工程之类】1 MVVM架构 - MVVM与单向数据流

前言这个系列将讲述使用MVVM架构、LiveData、Room、Kodein、Retrofit、EventBus来建立一个统一的、优雅的、可维护的TODO程序&#xff0c;本系列分为多个章节&#xff0c;从0开始一步一步引入这些优秀的库。下图展示的是Jetpack组件库包含的内容&#xff0c;这套的架构方案的核…

java ssl证书_Java安全教程–创建SSL连接和证书的分步指南

java ssl证书在有关应用JEE安全性的系列文章中&#xff0c;我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程。 如我们之前的文章中所述&#xff0c; 安全套接字层&#xff08;SSL&#xff09;/传输层安全性&#xff08;TLS&#xff09;将启用…

android运行的线程中,android中线程是否运行在单独的进程中?

android sdk中的描述Caution:Aservice runs in the main thread of its hosting process—the servicedoesnotcreateits own thread anddoesnotrunin a separate process (unless you specify otherwise). This meansthat, if your service is going to do any CPU intensive w…

通过Okta的单点登录保护Spring Boot Web App的安全

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 您可以使用SpringBoot和Okta在不到20分钟的时间内启动具有完整用户身份和授权管理的企…

java ee cdi_Java EE CDI程序化依赖关系消歧示例–注入点检查

java ee cdi在本教程中&#xff0c;我们将看到在注入Java EE CDI bean时如何避免程序依赖消除歧义。 我们已经在Jave EE依赖关系消除歧义示例中展示了如何避免CDI Bean中的依赖关系歧义消除。 在这里&#xff0c;我们将向您展示如何以动态方式避免依赖消除歧义。 我们将通过检查…

在EL表达式中引用ADF Faces组件

EL表达式通常用于在页面上指定ADF Faces组件的属性值。 有趣的是&#xff0c;我们可以使用component关键字来引用要为其评估EL表达式的组件实例。 这是略与此类似Java中。 例如&#xff0c;在以下代码段中&#xff0c;按钮的提示被评估为按钮的文本值&#xff0c;并且它的visi…

atom自动补全html代码,Atom - Emmet插件的使用详解(HTML/CSS代码自动补全)

一、Emmet的安装与介绍Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的工具&#xff0c;能够实现 HTML、CSS 的快速编写。官网地址&#xff1a;http://emmet.io/官方文档&#xff1a;http://docs.emmet.io/cheat-sheet/Atom的emmet介绍页面&#xff1a;https://at…

html怎么做出相框的效果,PS滤镜制作漂亮的实木相框效果

一、新建一个600 * 800像素的文件&#xff0c;然后新建一个图层&#xff0c;前景颜色设置为红色&#xff0c;背景设置为深红色&#xff0c;执行&#xff1a;滤镜 > 渲染 > 纤维&#xff0c;参数设置如下图。二、执行&#xff1a;图像 > 旋转画布 > 逆时针90度&…

crawler4j_迷你搜索引擎–使用Neo4j,Crawler4j,Graphstream和Encog的基础知识

crawler4j继续执行正在实现搜索引擎的Programming Collection Intelligence &#xff08;PCI&#xff09;的第4章。 我可能比做一次运动所咬的东西要多。 我认为&#xff0c;与其使用本书中所使用的常规关系数据库结构&#xff0c;不如说我一直想看看Neo4J&#xff0c;所以现在…

html图片显示原始大小,我如何使PHP / HTML图像在单击时显示原始大小?

如果您要使用纯JavaScript&#xff0c;则可以设置onclick事件侦听器并获取图像的实际大小(确定图像在浏览器中的原始大小吗&#xff1f;)&#xff0c;然后将此大小设置为image。(如果您希望第二次单击将其设置为旧尺寸&#xff0c;请将旧尺寸保存到全局变量中&#xff0c;然后进…

OWASP依赖性检查Maven插件–必须具备

我不得不非常遗憾地承认&#xff0c;我对OWASP依赖检查maven插件一无所知。 自2013年以来似乎已经存在。显然GitHub上已有千个项目正在使用它。 过去&#xff0c;我手动检查了依赖项&#xff0c;以根据漏洞数据库对其进行检查&#xff0c;或者在很多情况下&#xff0c;我只是完…

html数据填充,JS使用模板快速填充HTML控件数据

图片 图片名称 类型 大小 尺寸 上传日期 操作