我对Java导入系统有点困惑(我不确定它是关于Java导入还是这个库 - 我使用Apache POI 3.17):
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class Main {
public static void main(String[] args) {
try {
Workbook wb = WorkbookFactory.create(new FileInputStream(
"workbook.xls"));
Sheet sheet1 = wb.getSheetAt(0);
for (Row row : sheet1) {
for (Cell cell : row) {
// Alternatively, get the value and format it yourself
switch (cell.getCellTypeEnum()) {
///////////////// Why this is not CellType.STRING
case STRING:
System.out.println(cell.getRichStringCellValue()
.getString());
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
System.out.println(cell.getDateCellValue());
} else {
System.out.println(cell.getNumericCellValue());
}
break;
case BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case FORMULA:
System.out.println(cell.getCellFormula());
break;
case BLANK:
System.out.println();
break;
default:
System.out.println();
}
}
}
} catch (Exception e) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
从导入部分,U可以看到我没有导入
import org.apache.poi.ss.usermodel.CellType;
为什么这个代码在那个switch部分工作,每个case我只在那里使用enum类型(比如STRING但不是CellType.STRING),Java编译器如何知道这些类型来自哪里(我在eclipse中编辑代码,当我将鼠标悬停在"case STRING",它显示org.apache.poi.ss.usermodel.CellType.STRING)?
谢谢
在JLS,14.11节,说:
如果
switch语句的Expression的类型是枚举类型,则case与该switch语句关联的每个常量必须是enum该类型的常量.
编译器只需要一个简单的名称,因为它已经知道它需要什么类型.
SwitchLabel:
case ConstantExpression:
case EnumConstantName:
默认值:
EnumConstantName:
识别码
并且Identifier是没有一个简单的名称..
但这与导入包的概念不同.导入不是允许使用类型的机制; 它不像不导入包不允许使用该包.毕竟,人们总是可以使用类型的完全限定名称而不导入它,例如
org.apache.poi.ss.usermodel.CellType cellType = cell.getCellTypeEnum();
Run Code Online (Sandbox Code Playgroud)
导入包对于我们作为程序员来说是一种方便,因此我们每次需要引用类型时都不需要输入完全限定的类型名称; 我们只需要输入简单的名称.
在JLS,第7.5节,规定:
一个进口声明允许命名类型或一个
static构件通过简单的名称(§6.2),它由一个单个标识符来引用.如果不使用适当的import声明,引用另一个包中声明的类型或
static另一个类型的成员的唯一方法是使用完全限定名(第6.7节).
导入包不会影响编译器是否知道包中的包或类; 它只允许程序员使用简单名称以方便使用.