这样的事情:
class C {
typeof(this) foo() { return this; }
}
嗯,我知道在Java 6中这是不可能的,所以我很高兴听到我是否可以在Java 7中完成它。
修改
这对链接方法调用很有用,并且避免创建临时局部变量,如下所示:
class Entity {
typeof(this) refresh();
typeof(this) clone();
typeof(this) detach();
}
class FooEntity extends Entity {
@Override
typeof(this) detach() {
fooLink21.removeRef(this);
bar39.detach();
return this;
}
void doSomeInteresting() {}
}
fooEntity.clone().detach().doSomeInteresting();
以及更多。
我认为将此函数添加到编译器应该很容易,也许我应该入侵openjdk或者gcj?
顺便说一句,我从未成功重建openjdk。答案 0 :(得分:5)
如果您使用泛型,它可能看起来有点像这样:
class Parent<C extends Parent> {
public C getMe (){
return this;
}
}
class Sub extends Parent<Sub> { }
它可能有用,但我不建议编写这样的代码。这是糟糕的设计...
答案 1 :(得分:2)
我认为没有办法在Java 6或Java 7中做到这一点。添加它并不容易 - 我认为返回类型将是所谓的“依赖类型”,这是来自比Java目前更复杂的类型系统。
就我所知,Gressie关于向基类添加类型参数的答案是接近你想要的唯一方法。
但是,如果您准备使用辅助函数,则可以在类上没有类型参数的情况下执行此操作:
abstract class Entity {
public static <T extends Entity> T detach(T entity) {
entity.detach();
return entity;
}
protected abstract void detach();
}
然后你可以说:
import static Entity.detach;
detach(fooEntity).doSomeInteresting();
但这很笨重。
答案 2 :(得分:1)
我对Java(二年级SD学生主要使用C#/ C ++)知之甚少,但你可能想看看泛型。如果它们与我认为它们与C ++,C#有关,它们就像模板一样,您可以编写返回模板类型的方法。
答案 3 :(得分:1)
从你看起来的样子,为什么不使用构造函数?看起来你可能会问如何返回一个方法?如果是这样的话:
您可以使用Java返回方法。我强烈建议你不要考虑这种做法的替代方案。看看 java.lang.reflect ;提供对方法,字段和构造函数的访问。 Java并不意味着要处理一流的功能。如果您决定这样做,请准备好接受大量的报道......