2013-06-29 32 views
5

比方说,我有一个接口“内部”,和国际米兰有一个方法如何指定方法的返回类型为调用该方法的对象的类型?

Inter someMethod(); 

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

参数如何?如果国际米尔有第二种方法

void someMethod2(Inter inter) 

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

回答

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

} 

参考
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)

+0

这是诀窍。有一件事: “公共类C1实现国际” 我可以强迫在这里,“C1”不能实现Inter 以外的其他Inter吗? – user2460978

+0

这是设计。如果您尝试,您会收到编译器错误:C1实现Inter ,Inter 但是,如果您的意思是防止:C1实现Inter 我不认为这是可能的。 –

+0

我的意思是如果您尝试使用“C1实现Inter ”,或者通常“X实现Inter ”,则会出现编译错误。因为使用这种方法,接口本身不会强制someMethod()的返回类型必须与调用该方法的对象的类型相同。 – user2460978

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来做到这一点。

相关问题