2016-09-21 5 views
0

Java 7부터 다음과 같이 동일한 catch 절에서 여러 예외를 catch 할 수 있습니다.여러 유형의 객체를 메소드에 매개 변수로 전달

try { 
    ... 
} catch(IOException | SQLException ex) { 
    ... 
} 

마찬가지로 상속을 사용하지 않고 다음과 같이 구현할 수 있습니까?

public void passMultipleTypes(Type1 | Type2 obj) { 
    ... 
} 

obj 객체 Type1 또는 Type2 될 수 있습니다. 이 클래스가 생성되고 변경할 수 없으므로 상속을 사용하지 않으려합니다.. 그래서

public class Test1 extends CommonSuperClass { 
    ... 
} 

Type1Type2 비슷한 속성을 가지고 그것들을 정의 할 수 없습니다. 그래서 나는 obj과 같이 일하려고 생각했습니다. 일부 클래스 코드 겐 플러그의 일부로서 생성되므로

public void passMultipleTypes(Type1 | Type2 obj) { 
    System.out.println(obj.getCode()); 
    System.out.println(obj.getValue()); 
} 
+2

이 허용 대답을 살펴 여기 보자 :

class Or<L,R> { private final Optional<L> left; private final Optional<R> right; ... } 

그래서이 같은이 클래스를 사용하여 HTTP ://stackoverflow.com/questions/10777384/method-accepting-two-different-types-as-parameter – Daneel

+1

@Daneel OP가 제안한 솔루션을 선택할 수 있다고 생각하지 않습니다. 클래스가 생성되고 두 클래스의 인터페이스를 구현하는 것이 어려울 수 있습니다. – Knu8

+0

제네릭 종류를 확인하십시오. – CrazyJavaLearner

답변

1

.

상속과 함께 구성을 사용하여이 문제를 해결할 수 있습니다.

공통 인터페이스로 확장되는 Type1 및 Type2의 래퍼 클래스를 작성합니다.

이렇게하면 코드 재사용 기능을 제공 할뿐만 아니라 API와 타사 API 사이의 계층으로도 작동합니다.

public class Testing { 

    public static void main(String[] args) { 

     Processor processor = new Processor(); 
     processor.passMultipleTypes(new Type1Wraper()); 
     processor.passMultipleTypes(new Type2Wrapper()); 

    } 

} 

interface BasicType { 

    void operationOne(); 

    void operationTwo(); 

} 

class Type1 { 
} 

class Type2 { 
} 

class Type1Wraper implements BasicType { 

    private Type1 type; 

    @Override 
    public void operationOne() { 

     // type 1 method 

    } 

    @Override 
    public void operationTwo() { 

     // type 1 method 

    } 

} 

class Type2Wrapper implements BasicType { 

    private Type2 type; 

    @Override 
    public void operationOne() { 

     // type 2 method 

    } 

    @Override 
    public void operationTwo() { 

     // type 2 method 

    } 

} 

class Processor { 

    public void passMultipleTypes(BasicType object) { 

     object.operationOne(); 
     object.operationTwo(); 

    } 
+0

'passMultipleTypes (T obj) '에서'Type1'과'Type2' 메소드에 어떻게 접근 할 수 있는지 물어볼 수 있습니다. – Knu8

+0

타입 1과 타입 2는 공통 인터페이스를 구현해야합니다. 내 대답에 추가되었습니다. –

+1

다음은 제네릭을 도입하지 않고도 달성 할 수 있습니다.'Type1'과'Type2' 클래스는 공통 인터페이스를 구현하고'passMultipleTypes (BasicType type)'은 – Knu8

0

상속을 사용하고 싶지 않으므로 메소드 오버로드를 사용할 수 있습니다.

public void passMultipleTypes(Type1 obj) { 
    ... 
} 

public void passMultipleTypes(Type2 obj) { 
... 
} 

Type1의 인수를 전달하면 첫 번째 메서드가 호출됩니다. 인수가 Type2 인 경우 두 번째 호출됩니다.

+0

이 코드의 중복을 유도합니다. – Knu8

+0

예, 가능합니다. 그러나 문제는 수업을 수정할 수 없다는 것입니다. 이것은 유일한 다른 방법이었습니다. – user5478656

+0

그래. 나는 당신의 스타일로 현재의 방법을 가지고있다. 내가 중복을 피할 수 있도록이 질문을했습니다 :-) –

0

당신은 단지 방법의 오버로드를 사용 후 클래스 Type1Type2을 변경할 수없는 경우 :

public void passMultipleTypes(Type1 obj) { 
    System.out.println(obj.getCode()); 
    System.out.println(obj.getValue()); 
} 

public void passMultipleTypes(Type2 obj) { 
    System.out.println(obj.getCode()); 
    System.out.println(obj.getValue()); 
} 

"하지만 코드 중복 ...."그래, 맞아입니다. 코드 중복이있을 것입니다. 그러나 원래 코드를 변경할 수 없기 때문에 좋은 방법으로이를 해결할 수 없습니다. 중복을 다른 장소로 옮기십시오.

+0

음. 이 질문의 유일한 목적은 중복을 피하는 것이 었습니다. :-) –

+0

"can not change code"는 제한된 것이 아니라 알고 있습니다. –

0

당신은 ScalaEither 클래스와 같은 cutom 유형을 정의 할 수 있습니다 :

public void passMultipleTypes(Or<Type1, Type2> obj) { 
    if(obj.isLeft()) { 

    } else { 

    } 
} 
관련 문제