[英]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
現在可以指代兩件事:
這里用兩個箭頭表示:
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 通用參數的基本思想是使您的 class 可用於您在使用該 class 時可以傳入的某些類型。例如:T
,它的類型T
作為泛型參數,類型T
作為泛型參數, T
作為...您可能會明白為什么編譯器對此有問題。
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.