如何指定一个方法的返回类型为调用该方法的对象的类型?该问题涉及IT技术。

5
假设我有一个名为'Inter'的接口,该接口具有一个方法。
Inter someMethod();

如何指定返回对象的类型必须与调用该方法的对象类型相同?假设现有两个类'C1'和'C2'均实现了接口Inter,如果C1的实例调用了someMethod(c1.someMethod()),则其返回结果将是C1的一个实例;而如果C2的实例调用了someMethod,则返回结果将是C2的一个实例。
对于参数呢?如果Inter有第二个方法......
void someMethod2(Inter inter)

如何指定参数必须是与调用方法的对象相同类的实例?

3个回答

10
使用泛型。
public interface Inter<T> {

    T someMethod();
    void someMethod2(T obj);

}

public class C1 implements Inter<C1> {

    public C1 someMethod() {
      // ..
    }

    public void someMethod2(C1 obj) {
      // ..
    }

}

public class C2 implements Inter<C2> {

    public C2 someMethod() {
      // ..
    }

    public void someMethod2(C2 obj) {
      // ..
    }

}

参考资料 :
泛型类型 (Java™教程 > 泛型)

编辑 : (使用有界泛型类型; 响应于原帖评论)

public interface Inter<T extends Inter<T>> {

    T someMethod();
    void someMethod2(T obj);
}

public class C1 implements Inter<C1> {

    public C1 someMethod() {
        return new C1();
    }

    public void someMethod2(C1 obj) {
      // ..
    }
}

public class C2 implements Inter<C3> { // ERROR
    ..
}

但是,这里有一个问题。
public class C2 implements Inter<C1> { // COMPILES!
    ..
}

因为 C1 也满足 T extends Inter<T>。我相信这就是极限了。
参考资料: Bounded Type Parameters (The Java™ Tutorials > Generics)

这就是诀窍。不过有一件事: “public class C1 implements Inter<C1>” 我能否强制规定在此处,“C1”不能实现除Inter<C1>之外的其他Inter? - user2460978
这是有意为之的。如果你尝试这样做,你会收到一个编译器错误:C1 implements Inter<C1>, Inter<C2> 但是,如果你的意思是防止:C1 implements Inter<C2> 我认为这是不可能的。 - Ravi K Thapliyal
1
你可以尝试使用有界泛型类型。我认为你应该能在那里找到合适的东西。类似 public interface Inter<T extends Inter<T>> 这样的代码应该可以工作。 - Ravi K Thapliyal
你能否用那种方法重写这个例子? - user2460978
@newacct 是的,我在我的(已删除)评论中分享过,OP可能试图通过不同的设计来实现他想要的目标。但是,如果问题没有很好地展示问题域,建议重新设计总是很困难的。但是,我理解你的担忧。 - Ravi K Thapliyal
显示剩余2条评论

2
您可以尝试类似以下的方法:
public interface Inter<T> {

    public T doSomething();
}

public class C1 implements Inter<C1> {

    @Override
    public C1 doSomething() {
        return new C1();
    }
}

public class C2 implements Inter<C2> {

    @Override
    public C2 doSomething() {
        return new C2();
    }
}

0
如何指定返回对象的类型必须与调用方法的对象相同?
在Java中无法实现此功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接