이것은 새 질문과 같지만 자바로 작업 한 마지막 시간에는 해당 언어에 제네릭이 없었습니다.일반 부모를 통해 액세스 한 하위 클래스의 Java 정적 멤버
public abstract class AbstractBase { .... }
public class ConcreateSubA extends AbstractBase { .... }
public class ConcreateSubB extends AbstractBase { .... }
...
public class ConcreateSubZZ9PluralZAlpha extends AbstractBase { .... }
...
좀 레거시 코드를 정리하기 위해 노력하고있어, 반복적 인 중복의 톤이 모든 속으로 고려 될 수있는 하나 개의 장소가 거기를 : 나는 클래스 계층 구조를 (이름은 가능한 한 일반화로로 변경) 제네릭을 통해 단일 루틴. (이 루틴을 호출 할 때, 그것은 구체적인 클래스 하나에서 작동해야하기 때문에 내가 제네릭을 생각하고 있어요.)
루틴 모습을
public <Thing extends AbstractBase> void someFunc()
{
another_function_call (Thing.concreteSpecialToken);
// could also be
// another_function_call (Thing.concreteSpecialToken());
// if methods are more feasible than fields
// Cannot use
// another_function_call (Thing().concreteSpecialToken());
// because creating instances of these types is a Major Operation[tm]
}
처럼 나는 엄청나게 라인 대해 떠나요 하지만 중요한 부분은 다음과 같습니다. someFunc()
은 parametric 유형입니다 (실제로 인수가 있지만 그 중 아무 것도 추론하지 않습니다). 결국 특수 토큰을 가져와야하고 이것이 내가 퍼지게되는 곳입니다.
토큰은 각 구체적인 클래스에 대해 거대한 엉덩이 고유 문자열입니다. 클래스 기반이며 인스턴스 기반이 아닙니다. 실제 토큰 값은 각 서브 클래스에서 private static final
필드로 선언됩니다.
그래서 (결국) 하위 클래스의 개인 정적 필드를 얻으려면 기본 클래스의 공용 메서드/필드를 사용해야합니다. 분명히 의미가 없기 때문에 분명히베이스에 abstract static
메서드를 선언 할 수 없습니다. 데이터가 인스턴스 기반 인 경우 기본 클래스에 다형성 getter를 사용하면 간단하지만 하위 클래스는 정적입니다.
Java generics의 기능이 누락 된 것처럼 느껴지지만 whatever
이 추상 기본 클래스로 선언 할 수없는 경우가 아니면 Thing.whatever()
을 사용할 수 없습니다. Java의 한계 또는 전문성 부족으로 인해이 격차를 해소하려고합니다. 제가 생각한 한 가지 시도는 유망한 것처럼 보였습니다. 클래스 계층 구조 아래로 코드 복제본을 여러 번 가져 와서 똑같은 코드를 반복적으로 사용하여 추상적 인 메서드를 정의했습니다 ... 제네릭이 예방하는 데 도움이되는 요소입니다.
+1 'ZZ9PluralZAlpha'의 경우 : –