2016-04-05 12 views
0

I Klasse Matrix2D mit den folgenden Eigenschaften erstellen möchten:Wie Konstruktor Gattung Klasse Konstruktor aufzurufen

  1. Klasse sollte
  2. sollten in der Lage sein zu akzeptieren, wie viele Arten wie möglich allgemein sein (idealerweise alle)
  3. „Default“ Konstruktor sollten alle Zellen mit Standardtyp initialisieren Werte
  4. korrekt Fall behandeln, wenn Typ nicht Standardkonstruktors hat (wahrscheinlich Standardparameter löst dieses Problem)

Wie kann ich das tun? Dies ist meine Skizze:

class Matrix2D<T> : Cloneable, Iterable<T> { 
    private val array: Array<Array<T>> 
    // Call default T() constructor if it exists 
    // Have ability to pass another default value of type 
    constructor(rows: Int, columns: Int, default: T = T()) { 
     when { 
      rows < 1 -> throw MatrixDimensionException("Number of rows should >= 1") 
      columns < 1 -> throw MatrixDimensionException("Number of columns should be >= 1") 
     } 
     array = Array(rows, { Array(columns, { default }) }) 
    } 
} 

Antwort

3

Es gibt keine Möglichkeit zu überprüfen, ob eine Klasse einen Standardkonstruktor zur Kompilierzeit hat. Ich würde dieses Problem lösen, indem eine Fabrik vorbei, die Instanzen des angegebenen Typs erstellt:

class Matrix2D<T : Any> : Cloneable, Iterable<T> { 
    private val array: Array<Array<Any>> 

    constructor(rows: Int, columns: Int, default: T) : 
     this(rows, columns, { default }) 

    constructor(rows: Int, columns: Int, factory:() -> T) { 
    when { 
     rows < 1 -> throw MatrixDimensionException("Number of rows should >= 1") 
     columns < 1 -> throw MatrixDimensionException("Number of columns should be >= 1") 
    } 
    array = Array(rows) { Array<Any>(columns) { factory() } } 
    } 
} 

Bitte beachten Sie, dass Sie nicht einen Array vom Typ T in diesem Fall, da Informationen über seinen tatsächlichen Typen zur Laufzeit gelöscht verwenden können. Verwenden Sie einfach ein Array von Any, und werfen Sie ggf. Instanzen in T.

+0

Das sieht aus wie wenn wir verwenden 'Any' wir nicht brauchen zweiten Konstruktor: Konstruktor (Zeilen: Int, Spalten: Int, Test: T) { wenn { Reihen < 1 -> Wurf MatrixDimensionException (" Anzahl der Zeilen sollte> = 1 ") Spalten < 1 -> Wurf MatrixDimensionException (" Anzahl der Spalten sollte> = 1" sein) } Array = Array (Zeilen) {Array (Spalten) {Test wie Any}}} ist es nicht? – likern

+0

Das ist nur ein Convenience-Konstruktor, den Sie entfernen können. Es ist eigentlich nicht mit 'Any' verbunden. – Michael

1

Es ist nicht möglich, Standard-Konstruktor in Standardparameter aufzurufen.

Reified generics nur in Inline-Funktionen verfügbar.

Verwandte Themen