java – 具有自我约束的泛型的私有访问
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 具有自我约束的泛型的私有访问,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1272字,纯文字阅读大概需要2分钟。
内容图文
将私有字段访问与Java中的CRTP相结合似乎在可见性规则中发现了一个奇怪的边缘情况:
public abstract class Test<O extends Test<O>> implements Cloneable {
private int x = 0;
@SuppressWarnings("unchecked")
@Override
protected final O clone() {
try {
return (O) super.clone();
} catch (CloneNotSupportedException ex) {
throw new AssertionError(ex);
}
}
public final int getX() {
return x;
}
public final O withX(int x) {
O created = clone();
created.x = x; // Compiler error: The field Test<O>.x is not visible
return created;
}
}
只需将withX()方法更改为此…
public final O withX(int x) {
O created = clone();
Test<O> temp = created;
temp.x = x;
return created;
}
…使代码编译.我在Oracle的javac和Eclipse的编译器中对此进行了测试.是什么赋予了?
解决方法:
这实际上不是泛型的问题. JLS inheritance rules使私有字段在子类中不可见.因为X是私有的,所以它不是类型O的成员,即使它是Test< O>类型的成员. O是Test< O>的子类型.如果您使用过以下代码:
public final O withX(int x) {
Test<O> created = clone();
created.x = x;
return (O) created;
}
它会工作.这是Java不支持LSP的实例,但它只是类型系统的本地问题,因为私有字段仅可用于相同类型的对象.如果它不起作用,那么私有字段就不会私有.我不认为对递归模板的规则有一个特殊的例外是一个好主意.
请注意,这实际上并不是对您可以做的限制.您可以随时将子类型转换为超类型,以便进行更改,就像在替代代码中一样.
内容总结
以上是互联网集市为您收集整理的java – 具有自我约束的泛型的私有访问全部内容,希望文章能够帮你解决java – 具有自我约束的泛型的私有访问所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。