2017-12-26 16 views
1

私は、コンソールの入力メニューを作成する方法を書いています。このメニューは、ユーザーが選択できる複数のオプションを表示し、ユーザーが選択したオプションを返します。このメソッドはオブジェクトの配列を受け取り、toString()メソッドを呼び出すことでオブジェクトの配列を表示します。問題は、これらのオブジェクトのtoString()メソッドを呼びたくない場合がありますが、おそらくgetName()メソッドです。したがって、メソッド参照を渡すことができるようにしたいと思います。これはオブジェクトに対して呼び出すことができ、Stringを返します。 それから私はf.e。人の配列と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

Personおよび印刷Person.getFullName()

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

ありがとう、それは私が探していたものです!私は1つの質問があります:それは正しいです、私は特定のタイプにリターンをキャストする必要がありますか?あなたの例では:Person result =(Person)getMultipleCh ... – ThunderGh0st

+0

'List 'を渡すと、ジェネリック型は自動的にそれを行うべきです。 – shmosel

+0

あなたの権利、私のせいです。戻り値の型を "T"に変更するのを忘れた:/ – ThunderGh0st

1

これを達成する方法はたくさんあります。上記

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)); 
    } 
} 

:比較的現代的なアプローチは、method referenceを渡すことです方法getFullName()Stringを返します。あなたの例では

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

、あなたはこのようにそれを呼び出すことができます:

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

それとものリストを渡すことができ、私はあなたがこのために探していると思います

Demo.

関連する問題