7

このコードは正常に機能しているようです

class Rule<T>
{

    public <T>Rule(T t)
    {

    }
    public <T> void Foo(T t)
    {

    }
 }
  1. メソッドタイプパラメータはクラスタイプパラメータをシャドウしますか?
  2. また、オブジェクトを作成するときに、クラスのtypeパラメーターを使用しますか?

Rule<String> r = new Rule<String>();

これは通常、競合しない状況で、クラスの型パラメーターに適用されますか?つまり、クラスだけがコンストラクターではなく型パラメーターを持っている場合、またはこれはコンストラクターで型パラメーターを探しますか?それらが競合する場合、これはどのように変化しますか?

以下の説明を参照してください

関数呼び出しがある場合

x = <Type Parameter>method(); // this is a syntax error even inside the function or class ; I must place a this before it, why is this, and does everything still hold true. Why don't I need to prefix anything for the constructor call. Shouldn't Oracle fix this.
4

2 に答える 2

8

すべてのs は異なりますが、完全な構文Tでメソッドを呼び出す場合にのみ表示されます。

たとえば、次のコードは有効です。

new <Float>Rule<Integer>().<Character>Foo();

これを説明しやすくするために、コードが次のようになっていると仮定しましょう。

class Rule<A>
{

    public <B>Rule()
    {

    }
    public <C> void Foo()
    {

    }
 }

次に、次のようなジェネリック型を明示的に宣言できます。

new <B>Rule<A>().<C>Foo();

型が同じ名前の場合、最も内側の型が選択されます (Tクラスではなくメソッドで):

このコードでは、パラメータを取ります:

class Rule<T>
{

    public <T>Rule(T t)
    {

    }
    public <T> void Foo(T t)
    {

    }
}

次に、これは有効です:

new <Float>Rule<Integer>(3.2f); 

TコンストラクタではFloatではなくであることに注意してくださいInteger

もう一つの例:

class Example<T> {

    public <T> void foo1() {
        // T here is the <T> declared on foo1
    }

    public void foo2() {
        // T here is the <T> declared on the class Example
    }
}

前に何かがない明示的なジェネリック型でメソッドを呼び出すことを扱う別の質問を見つけました。静的インポートと同じクラスのメソッド呼び出しは同じようです。<Type>Java では、何らかの理由で行を開始できないようです。

于 2012-04-14T04:54:20.137 に答える
1

メソッドの型パラメーターは、クラスの型パラメーターを隠していますか?

コンストラクターの<T>宣言は、クラス型を参照していません。そうです、それはクラス型パラメーターを隠します。

この場合、たとえば引数として、コンストラクターで使用できるジェネリック型パラメーターとして使用されます。このコンストラクタを試してください:

public <P> Rule(P arg1, P arg2) {    
}

ご覧のとおり、型を定義し<P>、それを使用して、引数が type であることを確認していますP。あなたの場合、コンストラクターを使用せずに有効な型を宣言しています。

このページを見てください。

また、オブジェクトを作成するときに、クラスの型パラメーターを使用しますか?

すべてのジェネリック型定義には、変数としてのスコープがあります。したがって、コンストラクターから有効なクラス型が返されます。

于 2012-04-14T04:54:31.097 に答える