簡體   English   中英

泛型Java和類型參數的陰影

[英]Generics Java and Shadowing of type parameters

這段代碼似乎工作正常

class Rule<T>
{

    public <T>Rule(T t)
    {

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

    }
 }
  1. 方法類型參數是否影響類類型參數?
  2. 另外,當你創建一個對象時,它是否使用類的類型參數?

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.

你的所有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); 

請注意,構造函數中的TFloat ,而不是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
    }
}

我發現了另一個問題,它涉及使用顯式泛型類型調用方法而沒有它們之前的東西 看起來靜態導入和同類方法調用是相同的。 看起來Java不允許你出於某種原因使用<Type>開始一行。

方法類型參數是否影響類類型參數?

構造函數上的<T>聲明未引用類類型。 所以是的,它影響了類類型參數。

在這種情況下,它用作可以與構造函數一起使用的泛型類型參數,例如作為參數。 試試這個構造函數:

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

正如您所看到的,我定義了一個類型<P> ,然后我使用它來確保參數將是P類型。 在您的情況下,您聲明一個對構造函數有效的類型而不使用它。

看看這個頁面

另外,當你創建一個對象時,它是否使用類的類型參數?

每個泛型類型定義都將范圍作為變量。 因此,構造函數返回有效的類類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM