• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konstruktor klasy generycznej

Object Storage Arubacloud
0 głosów
548 wizyt
pytanie zadane 5 stycznia 2019 w Java przez Xarti Obywatel (1,380 p.)

Cześć, wiem, że w klasie generycznej można zrobić konstruktor w taki sposób:

class Fruits <T> {
        T fruit;

        public Fruits(T fruit) {
             this.fruit = fruit;
        }
}

ale czy da się wykorzystać konstruktor typu dla którego się tworzy daną klasę? Coś w stylu:

class Fruits <T> {
        T fruit;

        public Fruits() {
             this.fruit = new T();       // to nie działa :(
        }
}

 

2 odpowiedzi

+1 głos
odpowiedź 5 stycznia 2019 przez mbabane Szeryf (79,280 p.)
wybrane 7 stycznia 2019 przez Xarti
 
Najlepsza

Na jednym z listningów w książce Java. Kompedium Programisty. jest takie coś:

/* 
   Poniższego kodu nie można skompilować, 
   ponieważ informacje na temat
   typu sparametryzowanego nie istnieją 
   w trakcie pracy programu
*/
// if(iOb2 instanceof Gen2<Integer>)
// System.out.println("iOb2 to egzemplarz Gen2<Integer>");

Myślę, że to jest odpowiedź na Twoje pytanie, dlaczego to nie działa. Java kompilując kod generyczny robi tam normalne rzutowania z Object na jakiś konkretny typ:

Kod napisany przez programistę:

class Foo<T> {
   T obj;
   
   public Foo(T obj) {
      this.obj = obj;
   }
  
   public T getObj() {
      return obj;
   }
}

// uzycie
Foo<String> fooString = new Foo<>("Hello");
String obj = fooString.getObj();

Po kompilacji kod klasy Foo<T> będzie prawdopodobnie taki:

class Foo {
  Object obj;

  public Foo(Object obj) {
     this.obj = obj;
   }

   public Object getObj() {
      return obj;
   }
}

//tam gdzie bedzie uzycie:
Foo fooString = new Foo("Hello");
String str = (String) fooString.getObj();

Mówiąc jeszcze inaczej typy generyczne dla JVM nie istnieją. One są tylko elementem języka Java. A język Java i JVM to dwie różne rzeczy (mimo że w JVM J to Java). Weź pod uwagę fakt, że np. język Kotlin jest kompilowany do tego samego co Java -> czyli do bytecode.

Dodatkowo we wspomnianej książce Twój konkretny przypadek jest opisany tak:

Próba użycia parametru typu T do utworzenia obiektu spowoduje zgłoszenie błędu. Powód
takiego ograniczenia łatwo zrozumieć: kompilator nie wie, jakiego typu obiekt należy utworzyć.
T jest jedynie nazwą zastępczą.

Czyli to co wyjaśnia komentarz w pierwszym listningu. 

+2 głosów
odpowiedź 5 stycznia 2019 przez Aisekai Nałogowiec (42,190 p.)
Na logikę. Co jeśli, użytkownik jako typ Generyczny poda Interfejs? Jak wtedy byś chciał utworzyć obiekt? Jeden z powodów, dla których nie można utworzyć tak obiektu w klasie generycznej.

Podobne pytania

0 głosów
2 odpowiedzi 2,678 wizyt
pytanie zadane 27 września 2020 w C# przez Masterkk121 Początkujący (280 p.)
0 głosów
1 odpowiedź 827 wizyt
pytanie zadane 11 grudnia 2018 w JavaScript przez BluK Początkujący (410 p.)
0 głosów
1 odpowiedź 666 wizyt
pytanie zadane 16 listopada 2018 w Inne języki przez k222 Nałogowiec (30,150 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...