2016-06-23 2 views
0

En Python, je peux facilement créer une liste contenant des valeurs de différents types, par exemple .:Un langage typé statiquement peut-il prendre en charge des listes hétérogènes?

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

Cependant, dans les je connais, les listes ne peuvent contenir que des langues statiquement typé valeurs d'un seul type. Par exemple, std::vector<T> de C++ ne peut contenir que des valeurs de type T. Le List<T> de C# est similaire.

Est-il possible qu'un langage typé statiquement supporte des listes hétérogènes? Si oui, quelles langues ont un tel support?

+0

Vous pouvez avoir une liste de types 'boost :: any'. 'any' a été accepté dans la norme pour C++ 17 mais je ne suis pas sûr si une implémentation est disponible. Il utilise une technique appelée effacement de type, pour permettre aux éléments de stocker n'importe quoi. L'inconvénient de ce que je sais est que les éléments doivent se conformer à une interface prédéfinie ou doivent être moulés avant de pouvoir être utilisés. –

Répondre

0

Oui, en Java vous pouvez le faire en utilisant le type Object, mais pour moi, il pue comme un anti-modèle Java et vous avez probablement devriez pas le faire: 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); 
    } 
} 

sortie:

classe java.lang.Integer: 10
classe java.lang.Double: 10,5
classe java.lang.String: blahbl ah
classe teststackoverflowquestion.MyClass: 3
-------------

+0

Pouvez-vous interroger directement les types dans cette liste, cependant? En C++, les types sur un std :: tuple sont explicites. – xaxxon

+0

Je ne suis pas sûr de ce que vous pouvez ou ne pouvez pas faire avec, je ne l'ai jamais utilisé auparavant et j'essaye des choses pour la première fois maintenant. Tbh ça pue comme un anti-pattern Java. Comme il s'agit simplement d'utiliser le polymorphisme, je ne pense pas que le type exact doit être connu au moment de la compilation. Il utilise 'Object' comme type, donc je suppose que tout ce que vous pouvez faire avec c'est des méthodes d'appel définies dans' Object', et c'est [pas beaucoup] (https://docs.oracle.com/javase/8/docs/api /java/lang/Object.html). Mais vous * pouvez * faire une liste comme ça: P – Arjan

0

C++ a std :: tuple, bien que les types doivent être connus à la compilation temps.

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

En outre, vous pouvez avoir un pointeur/référence à un descendant d'un type de parent, aussi bien.

liste {fordptr, chevyptr};