[英]Java Generics. How to properly extend parameter typed class that extends Generic abstract parameter typed class
[英]How to define a class that features a generic parameter which extends a class that features a generic parameter?
考慮以下情況:
public class PointCloud<T extends Point> { }
public class PointCloud3d extends PointCloud<Point3d> { }
我將如何編寫一個 class,它采用作為PointCloud<T>
擴展的通用參數T
?
public class PointCloudReader<T extends PointCloud> {
T read(String path);
}
要么
public class PointCloudReader<T extends PointCloud<?>> {
T read(String path);
}
class這兩個定義有什么區別?
兩者都不。
用這個:
public class PointCloudReader<P extends Point, T extends PointClound<P>> {
T read(String path);
}
這不好,因為它使用PointCloud
的原始類型,並且無論如何都不起作用:
public class PointCloudReader<T extends PointCloud> {
T read(String path);
}
這不好,因為它使用了未知類型的PointCloud
,並且無論如何都不起作用:
public class PointCloudReader<T extends PointCloud<?>> {
T read(String path);
}
不同之處在於,在第一種情況下,您使用的是不推薦的原始類型。 在第二種情況下,您使用的是類型更安全的通配符。
例如,考慮以下代碼:
class Test <T extends ArrayList<?>>{
void test(T t) {
Object o=t.get(0);
t.add("someStr"); //this line will be a compile error
}
}
如果您使用<T extends ArrayList>
,您不會得到任何編譯錯誤,但如果您使用錯誤的類型 ArrayList,則會在運行時拋出異常。
但是如果你使用<T extends ArrayList<?>
,會有一個編譯錯誤來警告你這一行不是類型安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.