簡體   English   中英

通用 Class 名稱與通用參數相同

[英]Generic Class name same as generic parameter

對於下面的代碼

public class T<T> {
    public String toString() {
        return "Generic Types!";
    }
    public void run(T var) {
        Integer repeatCount = 12_57;
        System.out.println("debug: " + repeatCount + ", " + var.toString());
    }
    public static void main(String[] args) {
        System.out.println("Hello, World!");
        T<String> t = new T();
        t.run(t);
    }
}

public class T<T>行發出警告The type parameter T is hiding the type T<T>

T<String> t = new T()行給出錯誤cannot make a static reference to non-static type T

如果我將public class T<T>更改為public class T<K> ,它可以在 output 以下正常工作。 但我不明白原因。 output:

Hello, World!
debug: 1257, Generic Types!

我是 Generics 概念的新手,有人可以解釋一下上面的代碼有什么問題嗎?

在這里,您聲明了一個 class T ,帶有一個通用參數T 在這個 class 中, T現在可以指代兩件事:

  1. 通用 class
  2. 通用參數

這里用兩個箭頭表示:

public class T<T>
             ^ ^
             1 2

那么當你在這個class里面寫T的時候,Java怎么知道你是什么意思呢? 1 和 2 都是類型,根據語言的規則。 意思是 2 受到青睞。

如果您對它是哪條規則感興趣,它在 JLS 的§6.4.1中。

名為 n 的類型的聲明 d 隱藏了 scope 中 d 在整個 scope 中出現的點處名為 n 的任何其他類型的聲明。

第二個T在第一個T的 scope 中,因此隱藏它。

您在 class 中對T的所有引用都指的是第二個T ,即通用參數。 為什么泛型參數T是非靜態的,參見泛型 class 中的 Static 方法? Generics - 為什么 Class 類型變量在 static 上下文中無效?

雖然,即使泛型參數T是 static,它也不是泛型的,您將無法像在T<String>中那樣對其進行參數化(事實上,您不能將任何泛型參數設為泛型)。

除了重命名 class 名稱(第一個T ),您還可以使用完全限定名稱來引用它:

yourpackagename.T

編輯:您正在創建一個 class T類型T作為通用參數。 這兩個T不相同,通用參數T將 class T隱藏在 class 中(即,當您在 class 中使用T時,它將使用通用參數T ,而不是 class T )。 要解決此問題,請重命名通用參數或 class。

您已經創建了一個 class T ,它的類型T作為泛型參數,類型T作為泛型參數, T作為...您可能會明白為什么編譯器對此有問題。 通用參數的基本思想是使您的 class 可用於您在使用該 class 時可以傳入的某些類型。例如:

public class MyObject<T> {
    private final T object;
    
    public MyObject(T object) {
        this.object = object;
    }

    public T getObject() {
        return this.object;
    }
}

您可以將其用作:

MyObject<String> myStringObject = new MyObject<String>("Some string");
String myStringObject2 = myStringObject.getObject();

這里的好處主要是您可以在底部代碼塊中定義T是什么,因此您不必只使MyObject及其所有方法與Object一起使用並插入強制轉換以使類型系統接受它(不會出現編譯器錯誤當你在那個過程中犯了錯誤)。

暫無
暫無

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

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