2014-01-22 2 views
2

그래, 제네릭을 많이 사용한 적이 없으며 다음과 같은 방식으로 사용할 수 있는지 궁금합니다.Java generics 및 하위 클래스 정보

내가 그 위의 클래스를 확장 할 경우 그때 내가 문자열과 정수의 인수 목록과 함께 해봐요을 무시하도록 강요 될 것이다 다음을 것,

public class ASuperClass { 
    public abstract void doSomething(String arg1, Integer arg2); 
} 

그래서이 클래스가 있다고 가정 할 수 있습니다.

public class ASubClass extends ASuperClass{ 
    @Override 
    public void doSomething(String arg1, Integer arg2){ 
     some code..... 
    } 
} 

지금, 내 서브 클래스에서 내가 해봐요을 무시할 괜찮아요한다고 가정 할 수 있습니다,하지만 난 내 서브 클래스에서 추가 문자열 인수가 필요합니다. 그래서, 내가 뭘하고 싶은 다음이 있습니다 :

public class ASubClass extends ASuperClass{ 
    @Override 
    public void doSomething(String arg1, Integer arg2, String arg3){ 
     some code... 
    } 
} 

내 서브 클래스가베이스에 정의 된 추상적 인 서명을 구현하지 않기 때문에 위의하지만 컴파일되지 않습니다. 따라서 컴파일하려면 다음을 수행하십시오.

public class ASubClass extends ASuperClass{ 
    @Override 
    public void doSomething(String arg1, Integer arg2){} 

    public void doSomething(String arg1, Integer areg2, String arg3){ 
     here is my code...... 
    } 
} 

그래서 정확히 내가하려고하는 것은 무엇입니까? 내가 관심있는 것은, arg의리스트에 관계없이 기본 추상 메소드를 구현하기 위해, generics를 arg로 사용하여 클래스의 서브 클래스를 강제로 "강제하는"방법이 있는지입니다. 그래야하여 ASuperClass을 확장 컴파일 할 다음 위의 두 클래스를 컴파일 할 수 있도록

public class ASubClass extends ASuperClass{ 
    @Override 
    public void doSomething(String arg1, Integer areg2, String arg3){ 
     here is my code...... 
    } 
} 

public class AnotherSubClass extends ASuperClass{ 
    @Override 
    public void doSomething(String arg1, Integer areg2, String arg3, Integer arg4){ 
     here is my code...... 
    } 
} 

그래서, 당신은 기본 클래스 인수 목록을 "일반 -이지는"할 수 있습니까? 아래처럼 뭔가? 나는 아래의 구문이 잘못되었음을 알고 있지만 arg 목록을 일반화 할 수 있습니까?

public class ASuperClass { 
    public abstract void doSomething(<?>); 
} 

전체적으로 내 생각은 사람들이 기본 기능을 확장하고있는 응용 프로그램에 일관성을 적용하는 것입니다. 기본적으로 ASuperClass의 모든 서브 클래스에는 doSomething() 멤버 함수가있어 서브 클래스간에 일관성 (특히 메서드 이름)을 보장하지만 arg 목록은 하위 클래스마다 다를 수 있습니다.

위의 내용을 혼동하지 않기를 바랍니다. 이것이 가능한지 알고 싶다.

+0

간단히 말해서 불가능합니다. 그리고 제네릭도 사진으로 올 수 없습니다. 하위 클래스에는 두 가지 메소드가 있어야합니다. –

답변

0

방법 매개 변수를 오버라이드 (override)를 결정하는 데 사용되는 방법의 "서명"의 일부입니다. 서브 클래스가 기본 클래스의 메서드를 재정의하거나 추상 기본 클래스의 추상 메서드를 구현하거나 인터페이스 메서드를 구현하려면 매개 변수 유형을 포함한 전체 서명이 일치해야합니다. 당신은 수의 매개 변수를 취할 수있는 인수리스트를 원하시면

,이 구문을 사용할 수 있습니다 : 당신은 서브 클래스에서이 서명하는 방법을 재정의 할 수 있습니다

public abstract void doSomething(Object ... args); 

을, 당신은 많은 인수를 전달할 수 있습니다 당신이 원하는대로.이 디자인 결정의 일부 불행한 결과는

  • 귀하의 매개 변수가 지정되지 않은 지금 것을있다 - 각 방법은 계산을 진행하기 전에, 자신의 유형을 포함하여 매개 변수의 목록을 확인해야하며
  • 매개 변수의 프리미티브 유형은 Object에서으로 감싸 야합니다. 프리미티브는 박스 처리되거나 자동 저장되어야합니다.
0
public class ASuperClass 
{ 
    public abstract void doSomething(Object ... args); 
} 

public class ASubClass extends ASuperClass 
{ 
    @Override 
    public void doSomething(Object ... args) 
    { 
     here is my code...... 
    } 
} 

이 모두 통화가 가능합니다 : doSomething(str1, int1)doSomething(str1, int1, str2, int2);

+0

이것은 내가 생각하고있는 것입니다. 그래서, 이것은 모든 arg 타입을 포함합니까? @Override 공공 무효 해봐요 (문자열 ARG1, 정수 ARG2, INT의에서 arg3) {여기 내 코드는 ...... } 의미합니다 elipses 개체 예를 들어 나는 서브 클래스에서 가질 수 .... args 래퍼 원시 타입? 감사합니다. – tas2826

0

이와 같이 추상적 인 메서드를 정의하면이 추상 클래스를 구현하는 형식의 모든 개체에이 메서드가 포함된다는 것을 의미합니다.

예를 들어이 코드 예제를 살펴보십시오.

List<ASuperClass> list = new ArrayList<ASuperClass>(); 
list.add(new ASubClass()); 
list.add(new AnotherSubClass()); 

따라서 모든 유형의 ASuperClass 개체 목록을 만든 다음 두 개의 개체를이 목록에 추가합니다. 이 오브젝트들은 유형이 다르지만 둘 다이 공통 상위를 공유합니다. 즉, ASuperClass 유형의 모든 메소드 서명에 응답 할 수 있습니다.

for(ASuperClass obj : list) 
{ 
    obj.doSomething("parm1", 1); 
} 

하위 유형에서 매개 변수 목록을 결정하도록하면이 문제가 발생합니다. doSomething이라는 메서드가 있다는 것을 알았지 만 매개 변수가 무엇인지 알 수있는 방법이 없기 때문에 우리에게는 쓸모가 없습니다.

다른 사람들은 이것을 해치는 방법이 있음을 제안했습니다.

public abstract void doSomething(Object ... params); 

이것은 엄격하게 사실이지만 나는 올바른 생각을 가진 사람이 아무도이를 실제로하지 않을 것이라고 확신하지 못합니다. 완전성을 위해서만 제안되었습니다.

다른 한편으로는 동일한 유형의 매개 변수가 가변적이라면 더 안전하게 사용할 수 있습니다.

public abstract void doSomething(String parm1, Integer parm2, String ... params); 

이 경우 항상 문자열, 정수 및 가변 개수의 문자열이 필요합니다. 이렇게하는 것과 정말로 같습니다.

public abstract void doSomething(String parm1, Integer parm2, String[] params);