2016-08-21 2 views
6

Проблемы с компиляцией подклассов базового класса, который я определил, который имеет один метод, и каждый подкласс реализует абстрактный базовый метод, но javac говорит, что они даже не понятны в подклассе.Невозможно скомпилировать подкласс, который реализует абстрактный метод из базового класса

DbModel.java (базовый класс)

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 расширяет модель, которая имеет только общий метод ToString.

MenuPermissions.java (класс суб)

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") 
     ); 
    } 
} 

Ошибка компиляции

[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]  ^

Кто-нибудь видел, что проблема здесь? Я предполагаю, что я пропускаю что-то очень простое.

Дополнительная информация о требованиях:

Я построения основы сущности, которая генерирует объекты модели из данной базы данных. MenuPermissions выше - один из таких объектов модели (автоматически генерируемый классом, который я написал GenerateModel). Я хочу, чтобы каждая модель имела метод, который позволит мне получить новый экземпляр каждого объекта objecct на основе набора результатов, который будет соответствующим образом заполнять объект и возвращать его. В идеале это должен быть статический метод, но я пробовал его как конкретный метод на данный момент, так как мне нужно обеспечить его существование в каждом подклассе DbModel. Надеюсь, это имеет смысл.

+5

Ваш абстрактный метод имеет доступ к пакету, я не знаю, было ли это предназначено – peter

+0

@Laser Yep. .. Опубликовать его как ответ. Пальцы вверх. – Mordechai

+0

Уровень доступа может быть расширен при переопределении: [Идеал] (http://ideone.com/fIWznf) –

ответ

6

У вашего абстрактного метода newInstance есть доступ к пакету, я не знаю, было ли это предназначено, но если оно находится в другом пакете, тогда вы получите ошибку.

Edit:

Так что абстрактный метод в родительском классе не может быть решена, так как он не объявлен public. Возможное средство - добавить public в определение метода или переместить дочерний класс в тот же пакет, что и родительский класс: -D

+0

Можете ли вы рассказать о том, как исправить это? Мне нужно, чтобы сгенерированные классы находились в другом пакете. Я попытался разместить их в одном пакете, и он работает нормально, но это мне нехорошо. – ManoDestra

+2

@ManoDestra Проще говоря, сделайте абстрактный метод 'protected'. – Mordechai

+0

А, понял. Глупая школьная ошибка. Публикация этого исправления. Благодарю. – ManoDestra

Смежные вопросы