java enum switch case和namespace import如何工作

Kua*_*uan 4 java

我对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)?

谢谢

rge*_*man 9

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节).

导入包不会影响编译器是否知道包中的包或类; 它只允许程序员使用简单名称以方便使用.

  • 编译器根据switch语句顶部的表达式类型知道case标签的类型.它看到`cell.getCellTypeEnum()`并且知道类型是`CellType`.它是一个枚举,因此它强制所有case标签必须是该枚举类型的枚举常量. (2认同)