Несовместимые типы в «Для заявления» во время перекомпиляции Java - PullRequest
1 голос
/ 14 июля 2011

Все,

1-й раз Я НЕ Java-программист - за последние два дня я узнал то, что знаю, просто пытаясь перекомпилировать файл класса.Я просмотрел каждое сообщение здесь, которое имеет «несовместимые типы», но все еще не может решить проблему.У меня есть файл Java, но нет файла класса, и я получаю следующую ошибку при попытке перекомпилировать его.

ОШИБКА:

Source\idm\sap\ConfigDataTM.java:153: incompatible types
found   : java.lang.Object
required: idm.sap.ConfigDataTM
/* 177 */       for (ConfigDataTM x : xList) {

ИСТОЧНИК:

/*     */   public boolean add(ConfigDataTM element)
/*     */   {
/* 161 */     return this.rootData.add(element); } 
/* 162 */   public boolean addSysFile(String fileName) { return add(new ConfigDataTM    (fileName, "SYS", true)); } 
/* 163 */   public boolean addPasswdFile(String fileName) { return add(new ConfigDataTM(fileName, "PASS", true)); } 
/* 164 */   public boolean addVPNFile(String fileName) { return add(new ConfigDataTM(fileName, "VPN", true)); }
/*     */ 
/*     */   public String getFileToBeLoaded(String fileTYPE)
/*     */   {
/* 168 */     if ((!fileTYPE.equals("SYS")) && (!fileTYPE.equals("PASS")) && (!fileTYPE.equals("VPN"))) {
/* 169 */       System.err.println("[ConfigDataTM] WARNING: BAD TYPE");
/* 170 */       return null;
/*     */     }
/*     */ 
/* 173 */     String fileName = null;
/* 174 */     List xList = getVector();
/*     */ 
/* 176 */     if (xList != null) {
/* 177 */       for (ConfigDataTM x : xList) {
/* 178 */         if ((x != null) && 
/* 179 */           (x.getLoadFlag()) && (fileTYPE.equals(x.getType()))) fileName =   x.getFileName();
/*     */       }
/*     */ 
/*     */     }
/*     */ 
/* 184 */     return fileName;
/*     */   }

IЯ знаю, что ошибка связана с элементом ConfigDataTM и переменной xList, но кроме этого я потерян.

Любая помощь будет принята.

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Это связано с генериками .Компилятор пытается обеспечить безопасность типов - каждый объект в xList является экземпляром ConfigDataTM.Поскольку тип xList не имеет универсального параметра, по умолчанию используется Object.То есть он может содержать любой тип Object, а не только экземпляры ConfigDataTM.Чтобы обойти это, вы должны либо убедиться, что универсальный тип xList обработан правильно (для обеспечения безопасности времени компиляции), либо явно использовать приведение (для обеспечения безопасности во время выполнения).

например.(с обобщениями)

List<ConfigDataTM> xList = getVector(); 
// requires getVector() to return List<ConfigDataTM>

и без обобщений

for (Object object : xList) {
    ConfigDataTM x = (ConfigDataTM) object;
    ...

С неуникальными, если x не является экземпляром ConfigDataTM, тогда будет выдано исключение времени выполнения, и приложение будетавария.Если используются дженерики, то компилятор может проверить, как обрабатывается список во время компиляции, и быть уверенным, что в xList.

хранятся только экземпляры ConfigDataTM.
0 голосов
/ 14 июля 2011

Попробуйте:

if (xList != null) 
{
    for (Object x : xList) 
    {
    if ((x != null) &&  (((ConfigDataTM)x).getLoadFlag()) && (fileTYPE.equals(((ConfigDataTM)x).getType())))
    fileName =   ((ConfigDataTM)x).getFileName();
    }
}

В противном случае, похоже, что xList не содержит ожидаемый тип данных.

...