5

假设我有一个接口“Inter”,而 Inter 有一个方法

Inter someMethod();

如何指定返回对象的类型必须与调用该方法的对象相同?因此,如果我有两个实现 Inter 的类“C1”和“C2”,如果 C1 的实例调用 someMethod( c1.someMethod()),结果将是 C1 的实例,而如果 C2 的实例调用 someMethod,结果将是C2。

参数呢?如果国米有第二种方法

void someMethod2(Inter inter)

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

4

3 回答 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™ 教程 > 泛型)

编辑:(使用有界泛型类型;响应 OP 的评论)

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>。我相信这是可以做到的。

参考
有界类型参数(Java™ 教程 > 泛型)

于 2013-06-29T20:50:49.027 回答
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();
    }
}
于 2013-06-29T20:53:59.460 回答
0

如何指定返回对象的类型必须与调用该方法的对象相同?

你不能在 Java 中做到这一点。

于 2013-06-30T20:59:54.310 回答