2016-08-21 6 views
6

Masz problemy z kompilowaniem podklas klasy bazowej, którą zdefiniowałem, która ma jedną metodę, a każda z podklas implementuje abstrakcyjną metodę bazową, ale javac mówi, że nie są one jednak dokładnie zdefiniowane w podklasie.Nie można skompilować klasy podrzędnej implementującej metodę abstrakcyjną z klasy podstawowej

DbModel.java (klasa bazowa)

package com.manodestra.db; 

import java.sql.ResultSet; 
import java.sql.SQLException; 

public abstract class DbModel<T extends DbModel> extends Model { 
    abstract T newInstance(ResultSet rs) throws SQLException; 
} 

DbModel obejmuje model, który ma tylko ogólny sposób toString.

MenuPermissions.java (klasa sub)

package com.manodestra.csa.db.model.configNew; 

import com.manodestra.db.DbModel; 
import java.sql.Date; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Time; 
import java.sql.Timestamp; 

public class MenuPermissions extends DbModel<MenuPermissions> { 
    private final String menuId; 
    private final String userLevel; 

    public MenuPermissions(
     String menuId, 
     String userLevel 
    ) { 
     this.menuId = menuId; 
     this.userLevel = userLevel; 
    } 

    public String getMenuId() { 
     return this.menuId; 
    } 

    public String getUserLevel() { 
     return this.userLevel; 
    } 

    public MenuPermissions newInstance(ResultSet rs) throws SQLException { 
     return new MenuPermissions(
      rs.getString("menu_id"), 
      rs.getString("user_level") 
     ); 
    } 
} 

Kompilacja Błąd

[javac] Compiling 487 source files to C:\Media\Code\manodestra_java\bin 
[javac] C:\Media\Code\manodestra_java\src\com\manodestra\csa\db\model\configNew\MenuPermissions.java:10: 
error: MenuPermissions is not abstract 
and does not override abstract method newInstance(ResultSet) in DbModel 
[javac] public class MenuPermissions extends DbModel<MenuPermissions> { 
[javac]  ^

Każdy zobaczyć, co problem jest tutaj? Zgaduję, że przeoczam coś naprawdę prostego.

Więcej informacji na temat wymagań:

buduję ramy podmiot, który generuje obiekty modelu z danej bazy danych. Powyższe MenuPermissions jest jednym z takich obiektów modelu (generowanych automatycznie przez klasę, którą napisałem o nazwie GenerateModel). Chcę, aby każdy model miał metodę, która pozwoli mi uzyskać nową instancję każdego typu obiektu na podstawie zestawu wyników, który zapełni obiekt odpowiednio i zwróci go. Najlepiej byłoby, gdyby była to metoda statyczna, ale próbowałem jej teraz jako konkretnej metody, ponieważ potrzebuję wymusić jej istnienie w każdej podklasie DbModel. Mam nadzieję, że ma to sens.

+5

Twoja abstrakcyjna metoda ma dostęp do pakietu, nie wiem, czy było to zamierzone – peter

+0

@Laser Yep. .. Opublikuj jako odpowiedź. Kciuki w górę. – Mordechai

+0

Poziom dostępu można rozszerzyć, gdy nadpisujesz: [Ideone] (http://ideone.com/fIWznf) –

Odpowiedz

6

Twoja abstrakcyjna metoda ma dostęp do pakietu, nie wiem, czy to było zamierzone, ale jeśli jest w innej paczce, wtedy otrzymasz błąd.

Edit:

Więc metoda abstrakcyjna w klasie nadrzędnej nie może być rozwiązany, ponieważ nie jest ogłoszony public. Możliwym rozwiązaniem jest dodanie do definicji metody public lub przeniesienie klasy podrzędnej do tego samego pakietu, co klasa nadrzędna :-D

+0

Czy możesz wyjaśnić, jak to poprawić? Potrzebuję wygenerowanych klas, aby znaleźć się w innym pakiecie. Próbowałem umieścić je w tym samym pakiecie i działa dobrze, ale nie jest to dla mnie dobre. – ManoDestra

+2

@ManoDestra Po prostu, ułóż abstrakcyjną metodę 'protected'. – Mordechai

+0

Ah, rozumiem. Głupi błąd ucznia. Upublicznienie go poprawia. Dzięki. – ManoDestra

Powiązane problemy