如何将方法的返回类型指定为调用方法的对象的类型?

时间:2013-06-29 20:46:32

标签: java generics return-type

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

Inter someMethod();

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

参数怎么样?如果国际米兰有第二种方法

void someMethod2(Inter inter)

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

3 个答案:

答案 0 :(得分:10)

使用 Generics

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) {
      // ..
    }

}

参考
Generic Types (The Java™ Tutorials > Generics)

修改 :(使用有界通用类型;回应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>。我相信这是可以的。

参考
Bounded Type Parameters (The Java™ Tutorials > Generics)

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

  

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

你不能用Java做到这一点。