2016-06-23 11 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

0

C++ имеет зЬй :: кортеж, хотя типы должны быть известны во время компиляции время.

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

Кроме того, вы можете иметь указатель/ссылку на какой-либо потомка родительского типа, а также.

list {fordptr, chevyptr};