3

2 つの文字列をスレッドに渡す必要があり、スレッドは両方を含む配列を返します。callable を使用する必要があります。

これが私がこれまでに持っているものです:

public class toArray implements Callable<String[]> {

private String string1 string2;

public toArray (String first, String second)
{
    string1= first;
    string2 = second;
}

    @Override
    public String[] call() throws Exception {
        String [] allStrings = null;
            allStrings[0] = string1;
            allStrings[1] = string2;
        return allStrings;
    }
}

以下がメインです。

public class theFuntion{

    public static void main(String[] args) {


        FutureTask<String[]> task = new FutureTask (new MyCallable());
        ExecutorService es = Executors.newSingleThreadExecutor();
        es.submit (task);
        try{
               String[] result = task.get();
               System.out.println(result[1] + result[2]);
           }
        catch(Exception e){
                           System.err.println(e);
    }
         es.shutdown();
}

問題は次のmainとおりです。結果は String[] を期待しているが、オブジェクトを取得していると書かれています。結果をキャストすると、スローされるように例外を宣言する必要があると表示されます。

4

3 に答える 3

4

クラスの署名をに変更します

public class toArray implements Callable<String[]>

およびcallメソッドの署名

public String[] call() throws Exception

更新: わかりました、複数のエラーがあります...次の作業サンプルを参照してください

public class Test{

    public static void main(String[] args) {


        FutureTask<String[]> task = new FutureTask(new MyCallable("a", "b"));
        ExecutorService es = Executors.newSingleThreadExecutor();
        es.submit (task);
        try{
            String[] result = task.get();
            System.out.println(result[0] + result[1]);
        }
        catch(Exception e){
            System.err.println(e);
        }
        es.shutdown();
    }

    public static class MyCallable implements Callable<String[]>
    {

        private String string1, string2;

        public MyCallable (String first, String second)
        {
            string1= first;
            string2 = second;
        }

        @Override
        public String[] call() throws Exception {
            String [] allStrings = new String[2];
            allStrings[0] = string1;
            allStrings[1] = string2;
            return allStrings;
        }
    }
}
于 2012-08-28T20:22:07.360 に答える
2

ではCallable<V>、パラメータ化された型Vは の結果の型を表しますcall()。を返したいのでString[]、 の代わりにCallable<String>を使用しますCallable<String[]>。次に、 の戻り値の型を に変更callString[]ます。

@Override
public String[] call() throws Exception {
    String [] allStrings = new String[2];
    allStrings[0] = string1;
    allStrings[1] = string2;
    return allStrings;
}

補足として、Java のクラス名は名詞でなければならず、大文字で始める必要があります。

于 2012-08-28T20:21:18.780 に答える
1

ToArrayでクラスを参照していませんTheFunction。おそらくコンパイル エラーが原因です (ヒント: 修正については既に言及されています)。

新しい FutureTask は次のようになります。

FutureTask<String[]> task = new FutureTask(new ToArray("foo", "bar"));

素朴な答えを言わずに、次のcall()メソッドで 2 つの例外に遭遇しToArrayます。

  • まず、文字列配列が初期化されることはありませんが、初期化する必要があります。
  • すべての配列はゼロから始まります
于 2012-08-28T20:52:28.860 に答える