簡體   English   中英

如何定義具有通用參數的 class 擴展具有通用參數的 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.

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