-2

私には機能があります

boolean isValid(/* what goes in here? */) {  
     //do stuff  
}

関数シグネチャで、メソッドが任意の型 (プリミティブまたはオブジェクト) の単一パラメーターを受け入れるようにするには、パラメーター リストに何を入力する必要がありますか?

このサイトとグーグルで検索しましたが、戻り値の型が不明な状況しか見つかりませんでした。

4

4 に答える 4

1

コメントを読んだ後、人々があなたに渡すオブジェクトを有効にするビジネス上の必要があるように思われます。おそらく、時間が経つにつれて、より多くのタイプをサポートする必要があります。

最も簡単な解決策は、jtoomey が言ったように、メソッドを次のように作成することですpublic boolean isValid(Object val)。ただし、if ステートメントを作成する必要がある量と、新しい型の検証が必要な場合にコードを変更するのがどれほど難しいかを考えてみてください。

私にとっては、ただ 1 つのメソッドを提供するよりも、もう少し複雑なことをしたいと思うでしょう。ファクトリを活用して、次のようなクラス タイプに基づくバリデータを作成します。

public interface Validator<T> {

   public boolean isValid(T val) {
   }
}

public class ValidatorFactory {

    public static ValidatorFactory create(String configFile) {
         /*read config and create new instance */
    }

    public Validator<T> createValidator(Class<T> clazz) {
         /* base on config and create validator base on type*/
    }
} 


public class Application {

    public static ValidatorFactory vFactory = ValidatorFactory.create() 

    public static void main(String[] args) {

         Object val = Arguments.getVal(); //assume this exists

         Validator<Object> validator = vFactory.create(val.class);
         if (validator == null) {
            System.out.println("not valid");
            return;
         }

         System.out.println(validator.isValid());
    }
}

個人的には、Java のタイプ セーフ機能を捨てているため、これはひどい解決策だと感じていることに注意してください。しかし、どうしても必要な場合は、構成可能なファクトリを使用する方が、任意の型を受け取るメソッドだけよりも優れています。インターフェイスがあると、検証コードをValidator書くときに型を知ることができます。

于 2013-09-07T01:27:26.247 に答える
1

あなたは少し混乱していると思います。私はいくつかのことを明確にしようとします:

  • メソッドの戻り値の型は、そのメソッドを呼び出したコードの一部 (別名クライアント) に渡される値であることはおそらくご存知でしょう。Java のすべてのメソッド/関数は、1 つの型のみを返すことができます (基本的なポリモーフィズムに精通しており、IS A 関係が何であるかを知っていると仮定します...)。これが最初の明確化です。1 つの型のみを返すことができますが、1 つまたは複数のオブジェクトを返すことができます (データ構造型があります)。

  • 引数は、メソッド/関数の呼び出し元/クライアントが処理のために it に渡すことができる値です。引数には、ゼロまたは多数のパラメーターを指定できます。これは、必要な数のオブジェクトを渡すことができることを意味します。

  • パラメータは引数とまったく同じです。用語の違いだけです。用語を正確にしたいのですが、メソッドを定義するときのパラメーターは括弧であり、メソッドを呼び出すときの引数はそれらの括弧であると言えます。

  • 戻り値の型またはパラメーター/引数のいずれかで、渡すことができる 2 種類の型は、オブジェクトまたはプリミティブ型です。オブジェクト型のものを使用すると、任意のオブジェクトを返すことができます (オブジェクトはすべてのクラスのスーパー クラスです)。ただし、プリミティブ型はオブジェクトではないため、シグネチャ内の型 Object では数値を渡すことができませんが、ちょっとしたトリックが 1 つあります。Java には、プリミティブ ラッパー (Integer,Double..) として知られる特別な型のオブジェクトがあります。 .) このオブジェクトはプリミティブのオブジェクト表現であり、プログラマーがデータを簡単に操作するのに役立つ組み込み関数があるために使用されることがあります (それは主なポイントではありません。読み続けてください...)、数値プリミティブを表すすべてのラッパーNumber というクラスを拡張し、Java が autoboxing として知っている 1 つの機能のために、

とにかく、これがあなたが探していたトリックかどうかはわかりませんが、いずれにせよ、あなたがしようとしていることをする理由はまったくないということをアドバイスしたいだけです.それは本当に奇妙に聞こえます.そのようなことが実際のプログラミングで本当に必要だとは思いません。

このコードを見てください:

public static void main( String[] args )
{
    App app = new App();
    app.method(5);
}

public void method(Number number) {
    System.out.print(number);
}

別の方法: パラメーターを汎用にするために考えられるもう 1 つの例は、ジェネリックを使用することです。したがって、この回答を終了して私の主張を証明するために、ここでは、プリミティブかオブジェクトかを問わず、必要なものを何でも渡すことができるメソッドを示します。

public class App 
{
    public static void main( String[] args )
    {
        App app = new App();
        app.method(5);

        app.someMethod(9);
        app.someMethod("Whatever");
        app.someMethod(true);
    }

    public void method(Number number) {
       System.out.println(number);
    }

    public <T> void someMethod(T t) {
       System.out.println(t);
    }

}

これがお役に立てば幸いですが、実生活でこのようなことを決してしないとは思えません。

于 2013-09-07T00:51:59.940 に答える