java中方法的具体化_我为什么要关心Java没有具体化的泛型?
問題
這是我最近在一次采訪中提出的一個問題,即候選人希望看到添加到Java語言中的問題。它通常被認為是Java沒有的痛苦reified generics但是,當被推動時,候選人實際上無法告訴我他在那里可能取得的那些事情。
顯然因為Java中允許使用原始類型(以及不安全的檢查),所以可以顛覆泛型并最終得到(例如)實際包含537777662的aList。如果確定了類型信息,這顯然是不可能的;但必須有更多!
人們可以發布他們真正想要做的事情的例子,他們真正想要做的事情是**,是否可以使用具體的仿制品?我的意思是,顯然你可以獲得aListat運行時的類型 - 但是你會用它做什么?
public void foo(List l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
編輯:對此的快速更新,因為答案似乎主要是關注需要傳遞aClass作為參數(例如EnumSet.noneOf(TimeUnit.class))。我正在尋找更多的東西,這是不可能的。例如:
List> l1 = api.gimmeAList();
List> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
#1 熱門回答(97 贊)
最常引誘我的是無法利用多個泛型類型的多個調度。以下是不可能的,并且在許多情況下它將是最佳解決方案:
public void my_method(List input) { ... }
public void my_method(List input) { ... }
#2 熱門回答(80 贊)
從我遇到這個"需要"的幾次,它最終歸結為這個結構:
public class Foo {
private T t;
public Foo() {
this.t = new T(); // Help?
}
}
這在C#中有效,假設T具有adefaultconstructor。你甚至可以通過typeof(T)獲取運行時類型,并通過Type.GetConstructor()獲取構造函數。
常見的Java解決方案是傳遞Classas參數。
public class Foo {
private T t;
public Foo(Class cls) throws Exception {
this.t = cls.newInstance();
}
}
(它不一定需要作為構造函數參數傳遞,因為方法參數也很好,上面只是一個例子,為簡潔起見省略了try-catch)
對于所有其他泛型類型構造,可以通過一些反射幫助輕松解析實際類型。以下問答說明了用例和可能性:
獲取java.util.List的泛型類型
如何在運行時獲取泛型類型?
在抽象超類上獲取實際類型的泛型類型參數
#3 熱門回答(33 贊)
類型安全記住了。如果沒有具體的泛型,向下轉換為參數化類型將始終是不安全的:
List myFriends = new ArrayList();
myFriends.add("Alice");
getSession().put("friends", myFriends);
// later, elsewhere
List myFriends = (List) getSession().get("friends");
myFriends.add(new Friend("Bob")); // works like a charm!
// and so...
List myFriends = (List) getSession().get("friends");
for (String friend : myFriends) print(friend); // ClassCastException, wtf!?
此外,抽象將泄漏更少-至少可能對其類型參數的運行時信息感興趣的那些。今天,如果你需要有關其中一個通用參數類型的任何類型的運行時信息,你也必須通過其Class。這樣,你的外部接口取決于你的實現(無論你是否使用RTTI關于你的參數)。
總結
以上是生活随笔為你收集整理的java中方法的具体化_我为什么要关心Java没有具体化的泛型?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中行信用卡显示制卡中要等多久
- 下一篇: 能自己开店的技术行业 其实是有很多的