2016-03-27 17 views
0

C++のバックグラウンドから来て、オブジェクトの作成を経ることなく、アプリケーション全体で使用できる静的な静的メソッドをほとんど作成しないことを望んでいました。そして、私はJava Genericsで関数テンプレートの等価性を使用したいと考えていました。この時点で、私はJavaジェネリックスを学んでいることを明確にしたいと思います。Java Generics - 型引数を持つ静的メソッドの作成方法

しかし、これを試してみると、私はコンパイラが私にそうすることを許していないことが分かりました。そして私はvery good discussion as well hereを見ることができました。しかし、その後、私は周りの静的なクラスと同様のタッチで書くように警告メッセージを出して遊んだ。私の直感によれば、それはそこで働いた。明らかに、私が下に示した内部クラスにアクセスするのは不思議です。私はなぜこれがJavaでこのように設計されたのだろうと思っています。この内部クラスは外部クラスにジェネリックを提供します。

public class ReflectionBasics<X, Y> { 

    public static void findMax (X xData, Y yData){ 
     // compiler error - cannot reference static type to non-static type X 
    } 

    public void findMin(X xData, Y yData){ 
     // this is fine 
    } 

    static final class InnerClass<E> { 
     public void findMin(E data){ 
      // this will work 
     } 
    } 
} 

不器用なアクセサ:

class AccessorClass{ 
    AccessorClass(){ 
     ReflectionBasics.InnerClass<Integer> myData = new ReflectionBasics.InnerClass<Integer>(); 
     myData.findMin(400); 

    } 
} 
+2

https://docs.oracle.com/javase/tutorial/java/generics/methods.html Javaには一般的なメソッドがあります。また、Javaジェネリックスはテンプレートではなく、C++テンプレートが実行できる多くのことを行うことができないことにも注意してください。 (一方で、C++のテンプレートではできないいくつかのことができます) – Radiodef

答えて

1

あなたはメソッドに型パラメータを入れたい場合は、あなただけ(おそらくvoidなりたくありませんでした)戻り値の型の前にそれらを貼り付け:

public static <T extends Comparable<T>> T findMax(T a, T b) { 
    ... 
} 

ほとんどの場合、あなたは、コール・サイトで型パラメータをスキップすることができ、彼らはあなたのために推測されます:

Integer max = WhateverClass.findMax(integerA, integerB); 
+0

正しい宣言は 'public static です。void findMax(T a、T b){' – fRoStBiT

+0

@ fRoStBiT:Bah、それはメモリから厄介な構文を再現しようとしたときに得たものです。戻り値の型の前に型パラメーターを導入するのは意味があると思いますが、そのパラメーターに依存する可能性があります。 – user2357112

+0

@fRoStBiT - 私は質問に肯定的な応答をしてくれてありがとう。私はこの質問に投票した人にも感謝しますが、私は本当に彼の思考プロセスに同情します。この質問は、とにかく彼にとっては意味がありませんでした。私のような多くの新しいJavaプログラマーがこのような本物の質問をするだろうと確信しています。私は多くの人々が答えを知らなかったことができます。最初に応答する人は58.9Kの担当者で、26番目の訪問者でした。 – Suparna

関連する問題