2013-02-14 5 views
0

나는 그 안에 모두 DoSomething() 메서드가있는 여러 클래스가 있습니다. 그리고 클래스를 매개 변수로서 기대 개별 기능 : 해봐요() 타입 클래스 정의이다다른 클래스를 매개 변수로 함수에 전달 Java

public void DoStuff(Class c) { 
    c.DoSomething(); 
} 

그러나이 코드는 오류가 발생. 나는 또한이 같은 클래스의 인스턴스를 시도 :

public void DoStuff(Class c) { 

Object o; 

try { 
    o = c.newInstance(); 
} catch (InstantiationException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IllegalAccessException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
} 

을 그리고있는 doSomething() 메서드를 호출,하지만 난 같은 오류가 발생합니다.

클래스를 매개 변수로 전달하는 올바른 방법은 무엇입니까?

+0

두 번째 방법이 올바른 것 같습니다. 전체 오류 메시지를 게시 할 수 있습니까? – 11684

+2

'DoStuff()'! = DoSomething() – ogzd

+0

실제로 인스턴스입니다. 나는 없어야 해? – astralmaster

답변

3

이 같이 당신의 방법 doSomething를 선언하는 interface 만들기 : 당신은 다음

을 할 수

public class SomeClass implements Something { 
    public void doSomething() { 
     // do what? 
    } 
} 

: 같은 클래스가이 인터페이스를 구현해야

public interface Something { 
     void doSomething(); 
    } 

다음을

public void DoStuff(Something pInstance) { 
    pInstance.doSomething(); 
} 
+0

void doSomething()는 모든 SomeClass-es에 대해 달라야합니다. – astralmaster

+0

좋은 예가 있지만 다른 클래스가 해당 인터페이스를 구현하게하고 구현을 순환시키는 코드를 표시하는 것은 멋지다 : List things = Arrays.asList (new SomeClass(), new SomeClass); 그리고 나서 (Something s : thins) {s.doSomething()}을 수행하십시오. – comanitza

+0

@astralmaster 귀하의 이의를 이해하지 못합니다. 인터페이스의 선언에는 구현이 없습니다. 비헤이비어를 제공하는 선언 된 메소드를 구현하는 실제 클래스입니다. – Erik

0

doSomething() 메서드가있는 인터페이스를 만들고 모든 클래스에서이 인터페이스를 구현할 수 있습니다. 그런 다음 모든 수업에서 doSomething()으로 전화 할 수 있습니다. c가하는 유형 Class의 때문에

+0

감사합니다. 이것에 대해 생각해 보았습니다. 더 쉬운 방법이 없다면 그것을 할 것입니다. – astralmaster

1

첫 번째 코드 예제가 올바르지 하지DoStuff()

당신의 두 번째 코드는, 당신이 DoStuff() 방법이 유형에 개체를 cast하는 것이 더 적합한 필요가되어 있습니다 (예 : 모든 클래스가 구현 interface) 또는

, 당신은 단지 반사와 방법 DoSomething()를 호출 할 수 있습니다

예를 들어,

Method method = c.getMethod("DoSomething"); 
Object obj = c.newInstance(); 
method.invoke(obj); 
+0

네, 그렇지만 어떤 것이 그 대상이 될지 항상 알 수는 없습니다. DoStuff() 메서드가있는 여러 개체가 있습니다. 나는 그 물체를 보편적으로 전달하기를 원했다. – astralmaster

+0

리플렉션을 사용하여 메서드를 호출하거나 모든 클래스에 공통 인터페이스가 있습니다. – iTech

+0

스레드를 사용하여 작업 할 때 좋은 방법입니까? DoStuff()가 main()과 다른 스레드에있는 경우 – astralmaster

-2

당신이 doStuff() 메서드에 인스턴스 인을 전달하면이 개체는 호출 할 수있는 doSomething() 메서드를가집니다. 상속 계층 구조가없는 한 메서드에 Object 유형의 매개 변수를 사용하고 특정 Object으로 캐스팅해야합니다.

public void doStuff(Object o) { 
    if(o instanceof Class1) { 
    Class1 c1 = (Class1)o; 
    c1.doSomething(); 
    } 
    else if(o instanceof Class2) { 
    Class2 c2 = (Class2)o; 
    c2.doSomething(); 
    } 
    else { 
    .... 
    } 
} 
+0

그게 내가 예, 미안했다는 것을 의미합니다. – astralmaster

+1

이것은 실제로 원하는 기능을 얻으려면 매우 나쁜 방법입니다. – Erik

+0

@Erik 왜 그런가요? – astralmaster

0

난 당신이 유형 Object와 유형 Class을 혼동 생각합니다. Object 클래스는 직접 또는 간접적으로 Java로 작성하는 모든 클래스의 수퍼 클래스입니다 (Java의 현재 사용 가능한 버전이 적어도 있음). 모든 객체가 클래스 Object을 확장하기 때문에 모든 객체를 Object 유형의 매개 변수를 필요로하는 메소드에 전달할 수 있습니다. 유형 Class은 완전히 다른 것입니다. Class (거의 자기 자신을 혼란스럽게 만든) 유형의 객체는 클래스 리터럴 (myInstance.class) 또는 리플렉션에 의해 얻어집니다.클래스의 인스턴스를 DoStuff()으로 전달한 것으로 의심되어 컴파일러가 Class 유형의 객체가 아니라고 불평했습니다. ClassObject으로 변경하면 구현할 클래스에 해당 개체를 캐스팅해야한다는 점을 제외하고는 괜찮습니다. DoSomething

관련 문제