在Python中,我可以很容易地創建一個包含各種類型的值的列表,例如:靜態類型語言是否可以支持異構列表?
[0, 1.0, '2', MyClass(3)]
然而,在靜態類型語言中我所熟悉的,列表只能包含一個單一類型的值。例如,C++的std::vector<T>
只能保存T
類型的值。 C#的List<T>
與此類似。
靜態類型語言是否可以支持異構列表?如果是這樣,哪種語言有這樣的支持?
在Python中,我可以很容易地創建一個包含各種類型的值的列表,例如:靜態類型語言是否可以支持異構列表?
[0, 1.0, '2', MyClass(3)]
然而,在靜態類型語言中我所熟悉的,列表只能包含一個單一類型的值。例如,C++的std::vector<T>
只能保存T
類型的值。 C#的List<T>
與此類似。
靜態類型語言是否可以支持異構列表?如果是這樣,哪種語言有這樣的支持?
是的,在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
-------------
C++有標準::元組,儘管類型具有在編譯被稱爲時間。
http://en.cppreference.com/w/cpp/utility/tuple
另外,還可以有一個指針/參考親類型的任何後代,以及。
list {fordptr,chevyptr};
你可以有一個'boost :: any'類型的列表。 'any'已被接受爲標準的C++ 17,但我不確定是否有可用的實現。它使用稱爲類型擦除的技術,允許元素存儲任何內容。據我所知,這個缺點是這些項目必須符合預定義的界面,或者必須先投射才能使用它們。 –