日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java中方法的具体化_我为什么要关心Java没有具体化的泛型?

發布時間:2024/10/8 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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没有具体化的泛型?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。