2016-06-23 64 views
0

在Python中,我可以很容易地創建一個包含各種類型的值的列表,例如:靜態類型語言是否可以支持異構列表?

[0, 1.0, '2', MyClass(3)] 

然而,在靜態類型語言中我所熟悉的,列表只能包含一個單一類型的值。例如,C++的std::vector<T>只能保存T類型的值。 C#的List<T>與此類似。

靜態類型語言是否可以支持異構列表?如果是這樣,哪種語言有這樣的支持?

+0

你可以有一個'boost :: any'類型的列表。 'any'已被接受爲標準的C++ 17,但我不確定是否有可用的實現。它使用稱爲類型擦除的技術,允許元素存儲任何內容。據我所知,這個缺點是這些項目必須符合預定義的界面,或者必須先投射才能使用它們。 –

回答

0

是的,在Java中你可以通過使用類型Object做到這一點,但對我來說很臭就像一個Java反模式,你可能應該這樣做:P

package teststackoverflowquestion; 

import java.util.ArrayList; 
import java.util.List; 

public class TestStackOverflowQuestion { 

    public static void main(String[] args) { 
     List<Object> list = new ArrayList<>(); 
     list.add(10); 
     list.add(10.50); 
     list.add("blahblah"); 
     list.add(new MyClass(3)); 

     list.stream().forEach(o -> System.out.println(o.getClass() + " : " + o)); 
     System.out.println("-------------"); 
     list.stream().filter(o -> o.getClass().equals(Integer.class)) 
       .forEach(o -> System.out.println((int) o + 4)); 
    } 
} 

class MyClass { 
    int someField; 
    public MyClass(int someField) { 
     this.someField = someField; 
    } 

    @Override 
    public String toString() { 
     return Integer.toString(someField); 
    } 
} 

輸出:

類java.lang.Integer:10
類java.lang.Double:10.5
類java.lang.String:blahbl啊
類teststackoverflowquestion.MyClass:3
-------------

+0

您可以直接查詢此列表中的類型嗎?在C++中,std :: tuple上的類型是顯式的。 – xaxxon

+0

我不確定你可以做什麼或不能做什麼,我從來沒有用過它,現在我第一次嘗試使用它。 Tbh它像一個Java反模式。由於它基本上只是使用多態,所以我不認爲編譯時需要知道確切的類型。它使用'Object'作爲類型,所以我認爲你所能做的就是在'Object'中定義的調用方法,並且[很少](https://docs.oracle.com/javase/8/docs/api /java/lang/Object.html)。但是你可以*做一個像這樣的列表:P – Arjan

相關問題