KiKi:Java中没有const?zhuanlan.zhihu.com
上面的文章提到我们要实现编译期的immutable view的第一步是分离const和non-const的方法
也就是说 所有方法要么是const的要么是non-const的
那么copy呢?
很显然这是一个const方法 因为它并不会改变内部数据
不过copy的返回值类型应该是什么呢?
难道是ImmutableFoo?
interface ImmutableFoo {
ImmutableFoo copy();
}
很显然不够好
因为这让我们copy的返回对象无法修改
实际上我们想要的是什么?
没错是Foo 也就是最终实现这个接口的类的类型
在swift rust的泛型中有一个特殊类型叫做Self就是表示这种情况的
而Java中很遗憾并没有这个东西
不过我们可以写一个泛型参数
让使用者把实际类型写进去
interface ImmutableFoo {
Self copy();
}
但是很明显这个不够安全
因为使用者可以把Self写成任意类型
为了让Self更安全
我们给Self添加一些约束条件
大家仔细想就能知道Self一定是Immutable这是一个递归定义
所以我们可以这么改进
interface ImmutableFoo> {
Self copy();
}
然后我们就能开心的这写了
class Foo implements Immutable {
@Override
public Foo copy() {...} //注意这里是Foo哦}
此时如果把Self写成其他类型 比如Integer 是会出现编译错误的
但这样就完美了么
不 它不完美
它并不能阻止你这样做
class Bar implements Immutable {...}
class Foo implements Immutable {...} //注意这里 写了Bar 编译并不会出问题
在此就只能希望Java泛型也能加入Self类型