duangsues.is_a? SaltedFish
60 subscribers
609 photos
6 videos
91 files
562 links
🌶🐔🐟 duangsuse 的日常
尤其喜欢发些奇奇怪怪的东西
和转载别人的东西
Download Telegram
Forwarded from Luke
下面这段代码有问题么?有什么问题?为何会有这个问题?

List<? extends Object> list = new ArrayList<>();
list.add(123);
Object obj = list.get(0);
Forwarded from dnaugsuz
List<?extends Object> 感觉比较没意思吧.. 其实就是 List get,set:Object 的裸类型
轻松一点: list.add((Object)123); int x=(Object)list.get(0); ,这样不方便。
严苛一点: ?extends 相当于 Kotlin 的 out ,是有子类型兼容性的(即 P<T1> extends P<T> )。如果 List<?extends Object> xs = new ArrayList<Integer>(); xs.add((Float)0.1f); 就完蛋了,假设 xs 是作为函参定义的话。
这里正确的做法是用 boxed 的 List<Integer> ,也不能是 List<?extends Number> ,除非你保证不会 .add 或 .set。

这种情况(破坏 type constraint) Javac 抖机灵不让你 add() null 外的值,从某种意义上它也是有 in/out 检查的,只是语法太烂。
之所以 List<T> T=Any 或 Int 仍能用是因为 ArrayList<T1>() 的 T1是自动推导的,不存在子类型兼容问题。

嘛,我觉得这个作为面试题有点过分了。作为普通程序员,用 Kotlin 就能解决所有问题(逃
Forwarded from dnaugsuz
其实类型参数擦除是仅对虚拟机和方法体而言的…… 对编译器类型检查它是透明的。
Forwarded from Luke
不知道那个pom下载的依赖
Forwarded from Luke
Forwarded from Luke
#android https://t.iss.one/AndroidDevCn/184247
contentUrl Hinnka Zhou, [23.02.21 15:37]
选取图片拿到的content uri不能保存起来下次继续用吗?

Rikka, [23.02.21 15:39]
不知道 有没有取得 永久授权

Hinnka Zhou, [23.02.21 15:41]
通过ACTION_GET_CONTENT拿的图片

Rikka, [23.02.21 15:42]
takePersistableUriPermission

Hinnka Zhou, [23.02.21 15:47]
真坑, 通过ACTION_GET_CONTENT拿到的uri不支持takePersistableUriPermission

Hinnka Zhou, [23.02.21 15:47]
只有ACTION_OPEN_DOCUMENT才行

Rikka, [23.02.21 15:48]
本来就不是可以存起来的

Hinnka Zhou, [23.02.21 15:50]
所以说, 我要用这图片必须在自己App内存一份?

Yuze Wu | 女子高中生 | 喵!, [23.02.21 15:50]
[In reply to Rikka]
那saf获取的文件夹访问权限可以?

Rikka, [23.02.21 15:50]
双方进程都没死 就应该有权限

Hinnka Zhou, [23.02.21 15:51]
选图片设壁纸, 进程杀掉图片没了😅

Rikka, [23.02.21 15:52]
这种场景拿到就存一份是很正常的 吧

Hinnka Zhou, [23.02.21 15:53]
也行吧, 就是我这场景支持多选, 可能会选一大堆
Forwarded from dnaugsuz
感觉这样写好看些:
val img = getBitmap(vmod.playlistState[index]) ?: return
if (oldImg==null) { drawBitmap(surface, img); return }
launch(mainScope) {
ValueAnimator.ofFloat(0f, 1f).with(1000L, DecelerateInterpolator()).start { drawBitmap(surface, oldImg, img, it) }
}
fun Animator.with(duration: Long, interp: Interpolator) = apply { this.duration = duration; interpolator = interp }
fun <A: Animator> A.start(op: (Double) -> Unit) { addUpdateListener { op(it.animatedFraction) }; start() }
Forwarded from dnaugsuz
🤔
的确 basic block 加 br 是好选择
就记得 while 和 if else 的翻译方式

builder 除了 sizeof 和指令选择 到底掩盖了什么细节呢
BB 是中端优化上的概念,对跳转回填什么的大概也没有帮助吧,和 std::list 差不多
Forwarded from dnaugsuz
记得 mips 和 arm 在子程序基础上都差不多,是有个 lr 和 sp... 看了一下是 jal/jr $ax 这样
https://github.com/Ray-Eldath/whatever/blob/master/mips/fib.a#L40

寄存器分配不会写(这个还包括溢出到栈,就是局部带限制和优先级的指令操作数存储空间的分配吧) 完全用栈的话就方便多了,等于 [a,b,c] = sp 一样的「数组解构」
Forwarded from dnaugsuz
这个本质就是如何把代码写简单,做到高复用并且突出程序与数据的照应性。 以这种心态就没有任何教条了,也不记得任何具体技术的名称;只有子程序的输入和数据之结构的变化才是唯一所见的事。
因为只在乎输入和输出之间所经历必须的过程和代码复用,只用最基础的算法和函数式,自然就没有稀奇古怪的实现方式和设计特性了。
Forwarded from dnaugsuz
嘛 我说的 codegen 大概是指同级语言,以减少冗余为目的的 cg,MDHD 说的是高级到低级的铺平、序列化 codegen …… 这就完全不一样了
减冗余的本质上是宏,不管理或没有上下文,只是一句话代表几句话,顶多查个全局表这样。
真的编译器 asm ,必须实现 if switch while break 基础控制流甚至 && 等惰性短路计算表达式 解析器还要支持错误列表化,挺麻烦的。

现在还是一想到就头疼,流解析组合子并不能直白便利地解决 keyword 和跳空格、计行号的问题,要在 Java/JS 里写字典树和 sourceLoc 真是最痛苦的(当然对类 C 语言读 map entries 都可以 但是比较不智能)

不过抛开控制流的翻译和层叠作用域的问题,本质上就和同级语言的翻译差不多了,四则计算指令、字面量、值引用、值输出一对应一铺平生成,并没有多少种情况,其实最小化的编程语言就个 func 个 apply ,实际编译器就是多带些 intrinsic 操作而已。
Forwarded from MĐĦĐ
llvm ir 不是寄存器无限嘛,整成 ssa 然后 builder 自动分配,我学长主要做的就是这个
Forwarded from dnaugsuz
丝毫没有长进的动苏
两三年过去也没见得强多少
还是那个连二进制都不会的辣鸡
而且也没有在编译原理上有所进步
更别提回到 Android 了,被大佬吊着锤 什么都不懂

明明抛弃了这么多,却没有得到什么回报 还是那么的菜
为什么总是有大佬和意外的普通人能做到我不会的事情啊
Forwarded from dnaugsuz
噢……记起来了,是指 add(sub(L(10),L(5)), V(1)) 这种不用显式分配的 l/rhs

用的时候就仿佛是空气一样,不觉得有 SSA Value 这个东西,你一提我还以为是指 builder.alloca() 分配内存呢

不过如果完全不在编译期优化,这种也可以直接翻译成子程序调用…… add 什么的就做成 libcrt (会被打的