Kotlin 型变 + 星号投影(扯蛋)
Kotlin中的型变:
1. in,顾名思义,就是只能作为传入参数的参数类型
2.out, ..............,就是只能作为返回类型参数的参数类型
星号投影:
我们引用官网的吧--
- For
Foo<out T>, whereTis a covariant type parameter with the upper boundTUpper,Foo<*>is equivalent toFoo<out TUpper>. It means that when theTis unknown you can safely read values ofTUpperfromFoo<*>.
就是说返回参数类型可以不具体指定,用*号来引用上界即可,也就是我们用Any类型就行,它的含义Foo<*>=Foo<out Any>
好吧,我给个例子,里边有型变和投影,型变的概念是确定无疑,但是星号投影就是扯蛋,kotlin说了"我们还不成熟"
// 1
我们老老实实的写写
interface MyIfe<out C, in D> {
fun MyFun(d: D) {
println(d)
}
}
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe<Any,Int> {
init {
println(b)
}
fun foo():A {
return a
}
}
fun main(args: Array<String>) {
val res = MyClsEx<Any,Int>("Any", 13)
println("${res.a}+b refering to ahead")
res.MyFun(1)
}
result:
Any+b refering to ahead
1
Ok, 没问题
// 2
我们用上星号投影吧
interface MyIfe<out C, in D> {
fun MyFun(d: D) {
println(d)
}
}
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe<*,Int> {
init {
println(b)
}
fun foo():A {
return a
}
}
fun main(args: Array<String>) {
val res = MyClsEx<Any,Int>("Any", 13)
println("${res.a}+b refering to ahead")
res.MyFun(1)
}
//编译就错误
error: projections are not allowed for immediate arguments of a supertype
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe<*,Int> {
扯蛋第一步产生了,这个星号根本不能用嘛
// 3
怎么办呢?
看看官网,For example, if the type is declared as interface Function<in T, out U> we can imagine the following star-projections
其中interface Function让我想到----“可能在泛型函数中能实现星号投影”
所以
interface MyIfe {
fun <out C, in D> MyFun(d: D) {
println(d)
}
}
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe {
init {
println(b)
}
fun foo():A {
return a
}
}
//编译也错误
error: projections are not allowed for immediate arguments of a supertype
class MyClsEx<out A, in B>(val a:A, b:B):MyIfe<*,Int> {
//结论
泛型三大类别,(类,接口)和函数全都不能星号投影,那么你认为还能投影吗?
我认为不能
Finally:
但我就是对Kotlin有信心,就是这么固执,乍办呢!
哈哈哈
Kotlin 型变 + 星号投影(扯蛋)的更多相关文章
- SEO高手在扯蛋?
真正的高手SEO你在扯蛋吗?当大家都很会扯的时候,高手扯得肯定比你疼,不是他们 蛋比较敏感,而是他们的确更用力. 当你说我是SEO时,高手肯定说现在我在做的是SEM. 当你说我是SEM时,高手肯定在说 ...
- scala 型变
型变是复杂类型的子类型关系与其组件类型的子类型关系的相关性. Scala支持 泛型类 的类型参数的型变注释,允许它们是协变的,逆变的,或在没有使用注释的情况下是不变的. 在类型系统中使用型变允许我们在 ...
- Android之TextView密码输入变星号时间
private static class Visible extends Handler implements UpdateLayout, Runnable{ public Visible(Spann ...
- Cocostudio学习笔记(1) 扯扯蛋 + 环境搭建
转眼七月份就到了,2014已经过了一半,而我也最终算是有"一年工作经验"了,开心ing. 回想这一年Cocos2dx的游戏开发经历,去年下半年重心主要在游戏的逻辑上,而今年上半年重 ...
- Omi框架学习之旅 - 之开篇扯蛋
说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...
- kotlin泛型中星号投射
如果一个泛型类型中存在多个类型的参数,那么每个类型的参数都可以单独投射,例如:如果类型定义为:"interface Function<in T,out>",那么可以出现 ...
- 虾扯蛋:Android View动画 Animation不完全解析
本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...
- [虾扯蛋] android界面框架-Window
从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...
- 扯蛋css
使网页旋转代码: javascript:window.i=1;setInterval(function(){i++;document.body.style.cssText+="-webkit ...
随机推荐
- lxml基础
节点操作: from lxml import etree # 1.创建Element对象,参数即节点名称 root = etree.Element('root') print(root) # < ...
- js 去除金额的千位分隔符
export function delcommafy(num) { if (num != undefined) { num = num.toString(); num = num.replace(/[ ...
- 体验 PHP under .NET Core
昨天在 The week in .NET 中发现 Scott Hanselman 的这篇博文 Peachpie - Open Source PHP Compiler to .NET and WordP ...
- [No0000129]WPF(1/7)开始教程[译]
概要 在我使用了半年多 WPF 后,是时候写点关于 WPF 基础方面的东西了.我发表了一系列针对具体问题的文章.现在是到了让大家明白为什么说WPF是一款在界面开发上带来革命的产品了. 本文针对初级-中 ...
- 自动化运维工具-pdsh工具安装配置及简单使用讲解
1.先决条件: 安装pssh工具的主机针对远程主机需要配置免秘钥认证: ssh-keygen -t rsa ssh-copy-id [remotehost] 2.下载pssh工具安装介质: https ...
- ArcGIS API for JavaScript
以3.14版本为例: 1.部署环境: 下载:https://developers.arcgis.com/downloads/apis-and-sdks?product=javascript# 部署:h ...
- [administrative][qemu][kvm] qemu使用--bridge-helper
公司服务器,源码安装的 qemu-2.9.0. 不是yum装的. 问题1:非超级用户的kvm权限问题: 略,直接超级用户使用. 也许有用? https://access.redhat.com/docu ...
- ascii码值
ascii码值#0 空值 即null#8 退格键#13 回车键
- jquery.ajax与axios及定义拦截器
首先导入jquery和axios包 jquery.ajax function reg(){ var username = $("#username").val(); var pas ...
- mysql存储引擎的简介
前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...