Råtyper i Java

1. Introduksjon

I denne raske opplæringen skal vi ta en titt på råtyper, hva de er og hvorfor vi bør unngå dem.

2. Rå typer

En rå type er et navn for et generisk grensesnitt eller klasse uten typeargument:

Listeliste = ny ArrayList (); // rå type

I stedet for:

List listIntgrs = new ArrayList (); // parameterisert type

Liste er en parameterisert type av grensesnitt Liste samtidig som Liste er en rå type av grensesnitt Liste.

Rå typer kan være nyttige når de grensesnittet med ikke-generisk eldre kode.

Ellers, skjønt, det er motløs. Dette er fordi:

  1. De er ikke uttrykksfulle
  2. De mangler typesikkerhet, og
  3. Problemer observeres i løpetid og ikke på kompileringstidspunktet

3. Inexpressive

En rå type dokumenterer ikke og forklarer seg slik en parameterisert type gjør.

Vi kan enkelt utlede at en parameterisert type Liste er en liste som inneholder Strings. Imidlertid mangler en rå type denne klarheten, noe som gjør det vanskelig å jobbe med den og med API-metodene.

La oss se signaturen til metoden få (int-indeks) i Liste grensesnitt for å forstå dette bedre:

/ ** * Returnerer elementet på den angitte posisjonen i denne listen. * * @param indeksindeks for elementet som skal returneres * @retur elementet på den angitte posisjonen i denne listen * @ kaster IndexOutOfBoundsException hvis indeksen er utenfor området * (index = size ()) * / E get (int index) ;

Metoden få (int-indeks) returnerer a String på stilling indeks i parameterisert type Liste.

Imidlertid for en rå type Liste, returnerer den en Gjenstand. Dermed kreves det at vi tar ekstra innsats for å inspisere og identifisere typen element i rå typen Liste og legg til en passende typestøping. Dette kan introdusere feil på kjøretid som rå type er ikke trygt.

4. Ikke typesikker

Vi får pre-generisk atferd med rå typer. Derfor en rå type Liste godtar Gjenstand og kan inneholde et element av hvilken som helst datatype. Dette kan føre til typesikkerhetsproblemer når vi blander parametrerte og rå typer.

La oss se dette ved å lage noen kode som instantierer en Liste før du sender den til en metode som godtar rå type Liste og legger til en Heltall til det:

public void methodA () {List parameterizedList = new ArrayList (); parameterizedList.add ("Hei folkens"); metodeB (parameterizedList); } public void methodB (List rawList) {// raw type! rawList.add (1); }

Koden blir samlet (med en advarsel), og Heltall blir lagt til den rå typen Liste når henrettet. De Liste som ble vedtatt som et argument inneholder nå en String og en Heltall.

Kompilatoren skriver ut en advarsel på grunn av bruken av råtyper:

Merk: RawTypeDemo.java bruker ukontrollerte eller usikre operasjoner. Merk: Kompiler på nytt med -Xlint: ikke merket av for detaljer.

5. Problemer ved kjøretid

Mangel på typesikkerhet på en rå type har en årsakseffekt som kan føre til unntak ved kjøretid.

La oss endre forrige eksempel slik at metode A. får elementet i indeksposisjon 1 av vår Liste etter å ha ringt metodeB:

public void methodA () {List parameterizedList = new ArrayList (); parameterizedList.add ("Hei folkens"); metodeB (parameterizedList); Streng s = parameterizedList.get (1); } public void methodB (List rawList) {rawList.add (1); }

Koden blir samlet (med samme advarsel) og kaster a ClassCastException når henrettet. Dette skjer som metoden få (int-indeks) returnerer en Heltall, som ikke kan tilordnes en variabel av typen String:

Unntak i tråden "hoved" java.lang.ClassCastException: java.lang.Integer kan ikke kastes til java.lang.String

6. Konklusjon

Rå typer er vanskelig å jobbe med og kan introdusere feil i koden vår.

Å bruke dem kan føre til konsekvenser som kan være katastrofale, og dessverre skjer de fleste av disse katastrofene på kjøretid.

Sjekk ut alle utdragene i denne opplæringen på GitHub.