java重新翻译期间“For Statement”中的不兼容类型

时间:2011-07-13 23:32:06

标签: java javac foreach

所有

第一关我不是一个java程序员 - 我在过去的两天里学会了我所知道的只是试图重新整理一个类文件。我已经查看过这里有“不兼容类型”但仍然无法解决问题的帖子。我有一个java文件,但没有类文件,并在我尝试重新编译时收到以下错误。

ERROR:

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;
/*     */   }

我知道错误与ConfigDataTM元素和xList变量有关,但除此之外,我迷失了。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

这与generics有关。编译器正在尝试确保类型安全 - 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的实例。

答案 1 :(得分:0)

试试这个:

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

否则,看起来xList不包含您期望的数据类型。