java – 在返回与其对象相同类型的值的final方法中使用泛型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在返回与其对象相同类型的值的final方法中使用泛型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2425字,纯文字阅读大概需要4分钟。
内容图文
考虑以下不可变类:
A
B extends A
C extends B
D extends C
...
类A有一个名为process的方法,它获取一个类型为A的参数,然后返回一个调用对象类型的值:
public class A {
public final <T extends A> T process(A a) {
Class clazz = getClass();
T result = createObjectOfType(clazz);
return result;
}
}
public class B extends A { }
public class C extends B { }
这是(非常简单的)测试代码:
public void test()
{
A a = new A();
B b = new B();
C c = new C();
// Returns type A:
A resultAAA = a.process(a); // Works.
A resultAAB = a.process(b); // Works.
A resultAAC = a.process(c); // Works.
B resultAAA = a.process(a); // Runtime error.
B resultAAB = a.process(b); // Runtime error.
B resultAAC = a.process(c); // Runtime error.
C resultAAA = a.process(a); // Runtime error.
C resultAAB = a.process(b); // Runtime error.
C resultAAC = a.process(c); // Runtime error.
// Returns type B:
A resultBBA = b.process(a); // Works.
A resultBBB = b.process(b); // Works.
A resultBBC = b.process(c); // Works.
B resultBBA = b.process(a); // Works.
B resultBBB = b.process(b); // Works.
B resultBBC = b.process(c); // Works.
C resultBBA = b.process(a); // Runtime error.
C resultBBB = b.process(b); // Runtime error.
C resultBBC = b.process(c); // Runtime error.
// Returns type C:
A resultCCA = c.process(a); // Works.
A resultCCB = c.process(b); // Works.
A resultCCC = c.process(c); // Works.
B resultCCA = c.process(a); // Works.
B resultCCB = c.process(b); // Works.
B resultCCC = c.process(c); // Works.
C resultCCA = c.process(a); // Works.
C resultCCB = c.process(b); // Works.
C resultCCC = c.process(c); // Works.
}
我想修改源代码以将这些运行时错误转换为编译时错误或警告,而不必重载或覆盖进程方法.
但是,客户端/测试代码不得更改(没有强制转换或通用参数).
编辑:这个问题没有真正的解决方案.所以我接受了关于覆盖过程方法的明显答案.这对客户端代码最有效,即使这是一个维护噩梦.也许有一天可以修改Java类型系统,以便可以编写“这种类型”.然后我们可以写一些像公共最终这个过程(A a).如果您有兴趣,请参阅this page中的建议(在评论部分).
解决方法:
从Java 5开始,允许您的代码为在子类中重写的方法提供共变量返回类型.这是什么意思?
这意味着重写方法的返回类型必须是原始方法的子类.这使子类能够返回适当类型而不是父类型的类型.
假设您在A中有一个要在子类B中使用的方法,但是您希望它返回一个B实例.使用此模式:
class A {
public A myMethod() { ... }
}
class B extends A {
@Override public B myMethod() { ... }
}
B类重写A类中的方法(如果需要,它可以通过调用super.myMethod()来调用它并返回B实例).这是允许的,因为B是A的子类型(在类设计语言中,B是-A-A).
内容总结
以上是互联网集市为您收集整理的java – 在返回与其对象相同类型的值的final方法中使用泛型全部内容,希望文章能够帮你解决java – 在返回与其对象相同类型的值的final方法中使用泛型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。