2017-12-26 7 views
1

나는 사용자가 선택할 수있는 여러 옵션을 표시하고 사용자가 선택한 옵션을 반환하는 콘솔에 대한 입력 메뉴를 만드는 메서드를 작성했습니다. 이 메서드는 객체 배열을 허용하고 toString() 메서드를 호출하여 해당 객체를 표시합니다. 문제는 어떤 경우에는 이러한 객체에 대해 toString() 메서드를 호출하고 싶지 않지만 getName() 메서드 일 수 있습니다. 따라서 객체에 대해 호출 할 수있는 메소드 참조를 전달할 수있게하고 String을 반환합니다. 그럼 내가 할 수있어. 사람의 배열을 전달하고 getFullName() 메소드를 전달하십시오. 그 사람은 콘솔에 성을 표시 할 것이지만 나는 여전히 그 사람의 물건을 돌려 주겠다. 나는 그 사람의 물건을 그 이름으로 찾을 필요가 없다. 여기에 방법에 대한 내 현재 코드가 입니다 :해당 클래스의 개체에 대한 메서드 참조뿐만 아니라 개체를 제공하는 방법?

/** 
* Prints the provided question and the options to choose from 
* 
* @param question 
*   the question to ask the user 
* @param options 
*   list of objects the user can choose from 
* @return chosen object 
*/ 
public Object getMultipleChoiceResult(String question, List<?> options) { 
    int result = 0; 

    while (result > options.size() | result < 1) { 
     System.out.println(question); 
     for (int i = 1; i <= options.size(); i++) { 
      System.out.println("(" + i + ") " + options.get(i - 1).toString()); 
     } 

     try{ 
      result = scanner.nextInt(); 
      } catch (InputMismatchException e) { 
       System.err.println("wrong input"); 
       scanner.next(); 
      } 

    } 

    return options.get(result - 1); 
} 

당신은 내가 찾고 있어요 그리고이 가능 이해합니까?

+0

인터페이스를 사용하려는 것처럼 들립니다. –

+0

예, 그렇지만이 인터페이스를 구현하는 옵션으로 개체를 전달할 수만 있습니다. 클래스에 의존성이 정의되어있는 옵션으로 전달하고자하는 객체가 있으므로 편집 할 수 없습니다. – ThunderGh0st

답변

2

난 당신이 찾고있는 생각 :

Object result = getMultipleChoiceResult(question, options, Object::toString); 

아니면 목록을 전달할 수 있습니다

당신의 예에서
public <T> T getMultipleChoiceResult(String question, List<T> options, Function<T, String> toString) { 
    // ... 
    System.out.println("(" + i + ") " + toString.apply(options.get(i - 1))); 
    // ... 
} 

,이처럼 호출 할 수 있습니다 Person 및 인쇄 Person.getFullName() :

Person result = getMultipleChoiceResult(question, persons, Person::getFullName); 
+0

고마워, 그게 내가 찾고 있었던거야! 나는 하나의 질문을 가지고있다. 그것이 옳은가, 나는 복귀를 특정한 유형으로 던져야 만 하는가? 예제에서 : Person result = (Person) getMultipleCh ... – ThunderGh0st

+0

아니요, 제네릭 형식은'List '을 전달하면 자동으로 처리해야합니다. – shmosel

+0

네 오른쪽. 내 잘못. 반환 유형을 "T"로 변경하는 것을 잊었습니다. / – ThunderGh0st

1

이 방법에는 여러 가지가 있습니다. 상대적으로 현대적인 접근 방식은 통과하는 것입니다 method reference :

showList(myList, MyType::getFullName); 
(가) 위 myListList<MyType> 있다고 가정

MyType 비 정적이 있습니다

private static <T> void showList(List<T> list, Function<T,String> f) { 
    for (T t : list) { 
     System.out.println(f.apply(t)); 
    } 
} 

로 보일 것이다이 방법의 호출은 다음과 방법 getFullName()String입니다.

Demo.