2017-11-27 10 views
1

ListableNodeにはListable、そしてSinglyLinkedListにはノードが含まれていると宣言しました。 SinglyLinkedListは、方法matches()Listableに使用してsearch()メソッドを含んでいます。できるだけ一般的にはListableとしたいので、引数の量はmatches()にする必要があります。 search()は、一致するthisの要素のみを含む新しいSinglyLinkedListを返します。次の実装でパラメータリストを転送するには

ルック:配列searchArgsmatchesArgsは一つだけの要素を持っているので、

interface Listable { 
    // ... 
    boolean matches(Object... matchesArgs); 
    // ... 
} 

class Node { 
    Listable data; 
    Node next; 
} 

class SinglyLinkedList { 
    // ... 
    public SinglyLinkedList search(Object... searchArgs) { 
     // ... 
     somewhere: [someNode].data.matches(searchArgs) 
     // ... 
    } 
    // ... 
} 

これは、動作しません。私はそれがsearchArgsと等しく、[searchArgs]ではないことを望みます。

matches()の実装で配列をアンパックする必要はありません。matches()を使用するたびに引数の配列を渡す必要があり、作成されていない場所で問題を処理しようとします。

私の目では、問題は、matches()に転送するときにsearchArgsが別の配列にパックされていることです。この配列を渡す代わりに、その要素をパラメータとして渡したいと思います。

Javaでこれを行う方法はありますか?あなたはマッチを(使用するときの引数の配列を渡す必要となる

+0

あなたのコードはあいまいであるため警告が表示されます。このあいまいさの根源は、バリデーションメソッドで 'Object'を使うことです。メソッドが貧弱な 'Object'型を受け取らないようにあなたのシステムをモデル化することを考慮してください。 – Gabriel

答えて

0

への引数としてsearchArgsを渡すと、引数が別の配列にラップされることになります。このサンプルコードを取る:

import java.util.Arrays; 

public class HelloWorld { 
    public static void main(String[] args) { 
     doThat(1, 2, 3, 4, 5); 
    } 

    public static void doThat(Object... varargs) { 
     doThis(varargs); 
    } 

    public static void doThis(Object... varargs) { 
     System.out.println(Arrays.toString(varargs)); 
    } 
} 

出力が期待[1, 2, 3, 4, 5]です。

+0

あなたはまったく正しいです...私は実際にsearch()を呼び出す際に引数を忘れてしまいました。エラーを見たとき(私はいくつかの例外を実装しました)、すぐに私のパラメータをチェックするのではなく、コールサーチ()を最初に...これは恥ずかしいです。ありがとう! – user8772658

+0

全く恥ずかしいことはありません。あなたがコード化しようとしているものすべてで最高! – adrianwong

0

しかし、あなたはそれが可変長の配列を受け入れることを、メソッドのシグネチャで指定します。呼び出しコードでは、1つまたはいくつかの値を渡すことを止めるものはありません。内部のマッチメソッドは配列になります

+0

問題をより明確にするために質問を編集しました... 'matchesArgs'は配列ですが、問題は配列' searchArgs'という要素が1つしかないことです。代わりに 'searchArgs'と同じにしたいと思います。 – user8772658

0

私はあなたの質問を理解しているように、あなたの問題はに減らすことができます。

警告:不正確な引数の型を持つ可変引数メソッドの非可変引数呼び出しこのコードは次のような警告を発し

public class HelloWorld { 
    public static void main(String[] args) { 
    test(1, 2, 3); 
    test(new Integer [] {1, 2, 3}); 
    } 

    public static void test(Object... args) { 
    System.out.println("Length: " + args.length); 
    } 
} 

最後のパラメータの場合

問題は明らかです。 Javaは、配列を展開するか、最初の引数として渡すかを決めることはできません。

この問題は、適切なタイプを使用して解決します。

public class HelloWorld { 
    public static void main(String[] args) { 
    test(1, 2, 3); 
    test(new Integer [] {1, 2, 3}); 
    } 
         // here! 
    public static void test(Integer... args) { 
    System.out.println("Length: " + args.length); 
    } 
} 

このコードではあいまいさがなく、ちょうどいいです。出力は次のとおりです。

Length: 3 
Length: 3 

タイプシステムを有効に活用してください。

関連する問題