Metodi Java che sembrano: public static < F estende Field < F > > DenseVector < F > valueOf (F & # 8230; elementi) & # 8230; cosa sono?

StackOverflow https://stackoverflow.com/questions/1633211

  •  06-07-2019
  •  | 
  •  

Domanda

Quindi, sto guardando attraverso una libreria Java (JScience) dopo che qualcuno qui mi ha indirizzato premurosamente verso di essa per ottenere vettori (quelli matematici, cioè) in Java.

Sfortunatamente, non ho mai visto niente in vita mia come:

public static <F extends Field<F>> DenseVector<F> valueOf(F... elements)

come metodo che puoi chiamare nella classe DenseVector. Che cosa vuol dire, anche. Restituisce un " < F estende il campo < F > > " (e in tal caso, perché Eclipse pensa che sia un input?)

http: // jscience .org / api / org / jscience / matematica / vettore / DenseVector.html # valueOf (F ...)

Mi confonde davvero. Non riesco a creare un nuovo DenseVector () perché solo la super classe lo possiede, ed è protetto, e cercando di fare DenseVector.valueOf () apparentemente funziona solo se io dagli ... quella ... cosa strana come input.

Ho visto persone che devono istanziare metodi quando provano a creare un'istanza di oggetti (o qualcosa del genere) ... è così (o È quello?)) Cosa sta cercando di fare l'API?

Sono un po 'confuso di aver imparato java a scuola (e l'ho usato un po' sul lavoro, anche se usiamo molte cose differnet oltre a java), e non ho mai trovato nulla di simile. Per cosa è? Cosa sta cercando di farmi fare? È nuovo? Vecchio? Obscure?

-Jenny

È stato utile?

Soluzione

Dovresti essere in grado di invocare questo metodo per creare un vettore, come questo:

Real r1 = Real.ONE, r2 = Real.valueOf(2D), r3 = Real.ZERO;
DenseVector<Real> v = valueOf(r1, r2, r3);

In questo esempio, l'argomento tipo F è Real . Real obbedisce al vincolo " estende il campo < F > " perché implementa Field < Real > .

Per applicazioni diverse, è probabile che vengano utilizzati campi . Ad esempio, le applicazioni di sicurezza potrebbero utilizzare il campo ModuloInteger . È un po 'confuso perché questo è un campo matematico, non un "campo vettoriale" come se ne parlasse in fisica.

Usando le variabili di tipo, questa libreria aiuta ad assicurarsi di eseguire tutte le operazioni all'interno di un determinato campo. Ad esempio, dato v dichiarato come DenseVector < Real > come sopra, il compilatore si lamenterà se si tenta di moltiplicarlo per un numero Complex .

Altri suggerimenti

È un tipo di ritorno generico. Vedi qui per un tutorial su Java Generics.

Questi sono chiamati tipi generici. Sono stati aggiunti in Java 5 e sono simili ai modelli C ++.

L'idea è di definire una raccolta di elementi di un tipo particolare piuttosto che qualcosa di generale.

Questo ti aiuta a evitare il downcasting frequente. Nel vecchio codice Java, supponi di sapere che il tuo vettore conterrebbe solo X. Una volta recuperati gli elementi da quella raccolta, si otterrebbe semplicemente Object e si è dovuto effettuare il downcast esplicito.

È anche più sicuro perché non puoi inserire Y in un vettore di X e più chiaro da leggere per gli stessi motivi.

La storia dietro il " si estende " tra queste parentesi è possibile definire raccolte di " X e tutti i loro sottotipi " che accetterebbe comunque i sottotipi di X ma rifiuterebbe Y.

public static <F extends Field<F>> DenseVector<F> valueOf(F... elements)

Consente di scomporre questo:

public static

È un metodo statico pubblico.

<F extends Field<F>>

È un metodo generico per qualsiasi classe F in cui F è un'estensione del campo

DenseVector<F>

Restituisce un DenseVector (generico) per F

valueOf(F... elements)

Un metodo denominato valueOf in cui i parametri sono zero o più Fs.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top