2017-12-18 7 views
1

질문 제목이 약간 혼란 스럽다고 생각합니다. 그러나 이것을 말하는 더 정확한 방법을 찾을 수 없습니다.
내가 원하는 것을 말해주기 위해 간단한 코드 예제가 필요합니다.Java (또는 Kotlin)에서 "자체 클래스"를 나타낼 수 있습니까?

내가 가진 :

// code 1 
interface A { A bla(); } 
class B implements A { @Override public B bla() { return this; } } 
class C implements A { @Override public C bla() { return this; } } 

그러나 실제로는,이 코드도 컴파일 (차이 : 리턴 타입 선언을보고) :

// code 2 
interface A { A bla(); } 
class B implements A { @Override public A bla() { return this; } } 
class C implements A { @Override public A bla() { return this; } } 

내가 유형 오류로 코드 2를 원한다.
말하자면, 모든 A의 서브 클래스 'bla이 강제로 A 대신 자체를 반환하고 싶습니다. 나는 내가 원하는 것을 표현하기 위해 가짜 코드가 될 수 있다고 생각

:

interface A { this.Type bla(); } 

그냥 하스켈의 typeclasses 같은 :

class Monad (m :: * -> *) where 
    -- here m is restricted to the subclass 
    (>>=) :: m a -> (a -> m b) -> m b 

이 가능합니까?

+0

하지 수는, 코 틀린에 대해 알고하지 않도록 할 수 있습니다. – Oleg

+0

오, 아니요, 나쁜 소식 TAT @Oleg – ice1000

+0

@ ice1000이 라이브러리를 사용했습니다. 내가 찾고있는 것 같습니다 : https://github.com/h0tk3y/kotlin-monads;) –

답변

3

가능하지,하지만 당신은 자바

interface A<T extends A> { T bla();} 
class B implements A<B> { @Override public B bla() { return this; } } 
class C implements A<C> { @Override public C bla() { return this; } } 
+0

아, 많은 감사합니다! prpr – ice1000