2012-09-13 3 views
1

Java에서 this을 추상 클래스의 메서드 내에서 사용할 수 있습니까?하지만 추상 클래스뿐만 아니라 현재 사용중인 하위 클래스의 인스턴스로도 사용할 수 있습니까? 내가추상 Java 클래스에서 "this"를 참조하는 방법은 무엇입니까?

class MyImplementingClass extends MyAbstractClass<MyImplementingClass> { 

    @Override public MyImplementingClass self() { 
     return this; 
    } 
} 

와 모든 서브 클래스 I에 덮어하지만이 작업을 수행하는 더 우아한 방법이 있는지 궁금

abstract class MyAbstractClass <MyImplementingClass extends MyAbstractClass> { 

    public abstract MyImplementingClass self(); 
} 

. 특히, 모든 서브 클래스가 self()과 같은 루틴을 겹쳐 쓸 필요는 없습니다.

+2

구문 오류? 컴파일러에서 허용하지 않는 코드를 표시 할 수 있습니까? –

+4

여기에있는 문제는'self()'메소드가'MyAbstractClass'가 아니라'MyImplementingClass'를 리턴한다는 것입니다. MyAbstractClass를 돌려 주어야한다. 반환되는 객체의 동적 형 *은 관련 객체가 될 것이다. 나는 또한 당신이 '이'를 사용하지 않는 이유를 따르지 않는다? 호출 된 위치에 관계없이 올바른 * 동적 유형 *을 사용하여 객체 자체를 반환합니다. 당신이 필요하면 그것을 캐스팅 할 수 있습니다 – amit

+0

아주 좋은 포인트 amit. 참으로 문제인 것 같습니다. – user1111929

답변

3

:

class MyImplementingClass extends MyAbstractClass { 

    @Override 
    public MyImplementingClass self() { 
     return this; 
    } 
} 

이것은 당신이 대신 Object의 정확한 유형을 반환 clone()를 오버라이드 (override) 할 수있는 이유이기도하다 여기에있는 문제는 self() 메서드가 MyImplementingClass을 반환하고 MyAbstractClass을 반환하지 않는다는 것입니다.

MyAbstractClass을 반환해야하며 반환되는 개체의 동적 유형이 해당됩니다.

나는 또한 왜 this을 사용하지 않을까요? 호출 된 위치에 관계없이 올바른 동적 유형과 함께 개체 자체를 반환합니다. 필요한 경우 캐스팅 할 수 있습니다.

0

난 당신이 자바 메소드를 오버라이드 (override) 할 때 그

@Override public MyImplementingClass self() { 
    return MyImplementingClass.newInstance(); 
} 
1

처럼 행동하는 클래스의 newInstance()을 반환 할 수 있습니다, 생각, 당신은 원래 타입의 서브 클래스로 반환 형식을 무시할 수 있습니다. 이 코드는 완전히 유효합니다

abstract class MyAbstractClass { 

    public MyAbstractClass self() { 
     return this; 
    } 
} 

그리고 구체적인 클래스 :

public class SomeCloneable implements Cloneable { 

    @Override 
    public SomeCloneable clone() { 
     return new SomeCloneable(); 
    } 
} 
관련 문제