2016-06-23 33 views
0

In Python, ich eine Liste einfach erstellen kann Listen Werte verschiedenen Typen, z .:Kann eine statisch typisierte Sprache heterogene Listen unterstützen?

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

jedoch in den statisch typisierten Sprachen Ich bin vertraut mit, können nur Werte eines einzigen Typs enthält. Zum Beispiel kann C++ std::vector<T> nur Werte des Typs T enthalten. C# List<T> ist ähnlich.

Kann eine statisch typisierte Sprache heterogene Listen unterstützen? Wenn ja, welche Sprachen haben diese Unterstützung?

+0

Sie könnten eine Liste von 'boost :: any' Typen haben. 'any' wurde für C++ 17 in den Standard übernommen, aber ich bin mir nicht sicher, ob eine Implementierung verfügbar ist. Es verwendet eine Technik, die als Löschen bezeichnet wird, um den Elementen zu erlauben, alles zu speichern. Der Nachteil, soweit ich weiß, ist, dass die Items einer vordefinierten Schnittstelle entsprechen müssen oder erst gegossen werden müssen, bevor sie verwendet werden können. –

Antwort

0

Ja, in Java Sie könnte dies tun, indem Typ mit Object, aber für mich ist es stinkt wie ein Java anti-Muster und Sie wahrscheinlich sollte es nicht tun: 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); 
    } 
} 

Ausgang:

Klasse java.lang.Integer: 10
Klasse java.lang.Double: 10.5
Klasse java.lang.String: blahbl ah
Klasse teststackoverflowquestion.MyClass: 3
-------------

+0

Können Sie die Typen in dieser Liste jedoch direkt abfragen? In C++ sind die Typen auf einem std :: tuple explizit. – xaxxon

+0

Ich bin mir nicht sicher, was du wirklich kannst oder was du damit machen kannst, ich habe es noch nie zuvor benutzt und ich probiere Dinge jetzt zum ersten Mal damit aus. Tbh stinkt wie ein Java-Anti-Pattern. Da es im Grunde nur Polymorphismus ist, glaube ich nicht, dass der genaue Typ zur Kompilierzeit bekannt sein muss. Es verwendet 'Object' als Typ, also nehme ich an, dass alles, was Sie damit machen können, Aufrufmethoden sind, die in' Object' definiert sind, und das ist [nicht viel] (https://docs.oracle.com/javase/8/docs/api /java/lang/Object.html). Aber du * kannst * eine Liste so machen: P – Arjan

0

C++ hat std :: tuple, obwohl die Typen bei der Kompilierung bekannt sein müssen Zeit.

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

Sie können aber auch einen Zeiger/Verweis auf jeden Abkömmling einer Elterntyp haben, wie gut.

Liste {fordptr, chevyptr};