静态类型语言可以支持异构列表吗?

时间:2016-06-23 00:56:11

标签: list typing dynamic-typing static-typing

在Python中,我可以轻松创建包含各种类型值的列表,例如:

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

但是,在我熟悉的静态类型语言中,列表只能包含单个类型的值。例如,C ++的std::vector<T>只能保存T类型的值。 C#&#39; s List<T>类似。

静态类型语言是否有可能支持异构列表?如果是这样,哪种语言有这种支持?

2 个答案:

答案 0 :(得分: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);
    }
}

输出:

  

class java.lang.Integer:10
  class java.lang.Double:10.5
  class java.lang.String:blahblah
  class teststackoverflowquestion.MyClass:3
  -------------
  14个

答案 1 :(得分:0)

c ++有std :: tuple,但必须在编译时知道这些类型。

http://en.cppreference.com/w/cpp/utility/tuple

此外,您还可以拥有指向父类型的任何后代的指针/引用。

list {fordptr,chevyptr};