1
A
回答
0
使用泛型:
class A<T extends A> {
public T get() { }
}
class B extends A<B> {
}
B b = new B();
B got = b.get();
0
我假设你想要写的东西像B b = new B().get();
没有明确的类型转换喜欢尼基塔Beloglazov表明,尽管这不是Java支持以及一个成语。尤金的答案效果不错,尽管这仍然涉及到T
,并生成一个丑陋的编译器警告。就个人而言,我会越写如下代码:
class A {
private A() {}
public A get() {
return new A();
}
}
class B extends A {
private B() {}
@Override
public A get() {
return new B();
}
public B getB() {
return (B) get();
}
}
你仍然不能做B b = new B().get();
,但你可以做B b = new B().getB();
,这也很容易,多一点自我记录不管怎么说,既然你已经知道了你想要一个B
对象,而不是任何A
对象。而A a = new B().get();
会创建一个B对象,尽管只能访问A
中声明的方法。
1
从JDK 5开始,Java允许您更改重写方法的返回类型,只要新类型是原始类型的子类。 这叫做covariant return type。 下面的代码将正确编译:
class A {
A get() {
return new A();
}
void sayHello(){
System.out.println("Hello");
}
}
class B extends A {
@Override
B get() {
return new B();
}
void sayGoodbye(){
System.out.println("Goodbye");
}
}
class Test{
void check(){
B two=new B();
two.get().sayGoodbye();
}
}
记住,覆盖方法的返回类型应为返回类型的子类,允许你调用一个变量的方法,并得到一个有效的目的(其实际上是B实例):
void check(){
A two=new B();
A copy=two.get();
copy.sayHello();
}
相关问题
- 1. Java泛型,不兼容类型的错误(与继承)
- 2. 继承方法与无关的返回类型
- 3. 无与返回类型'MKClusterAnnotation'兼容
- 4. 不兼容的返回值类型
- 5. java.lang.IllegalStateException:不兼容的返回值类型
- 6. Java - 错误:返回类型不兼容
- 7. 变量返回不兼容类型
- 8. 不兼容的返回类型
- 9. 返回类型和多继承?
- 10. AWS Lambda:返回类型String与POJOClass不兼容
- 11. 原型继承返回值
- 12. 无法处理托管/返回引用'defaultReference':返回引用类型(java.util.List)与托管类型不兼容(ForumAnswerReplay)
- 13. 类型继承与表继承
- 14. 如何继承具有不同通用返回类型的方法
- 15. 继承的类返回不同的值
- 16. 返回继承了基于C++的返回类型
- 17. 继承与C#泛型,而类继承类型
- 18. Java方法:检索继承类型
- 19. 不兼容类型
- 20. 类型不兼容
- 21. 继承时__new __()不返回
- 22. 不兼容的块指针类型?不能返回NSArray
- 23. 方法在迅速与返回类型
- 24. 继承和功能具有不同的返回类型
- 25. 继承的工厂方法应该返回自己的类的实例不继承类
- 26. 泛型不兼容类型
- 27. 扩展方法 - 如何在继承中返回正确的类型?
- 28. wse3继承的类类型不被接受为方法参数
- 29. 爪哇 - 休眠:与继承人映射类的上市同时返回父类的内容及其继承人
- 30. 与NSDate不兼容的指针类型
您使用的是哪个版本的Java? – 2012-04-27 17:44:53
对不起,纠正了这个例子; @ – nabil 2012-04-27 17:47:22
你想写'B b = new B()。get();'而不显式强制转换? – 2012-04-27 17:50:50