2013-06-29 42 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來做到這一點。

相關問題