Java 编译时的基元变量类型

Java 编译时的基元变量类型,java,eclipse,compilation,primitive-types,Java,Eclipse,Compilation,Primitive Types,不确定我的措辞是否正确。如果您需要更多信息,请告诉我。 我们需要根据系统环境变量确定变量类型 那么,假设我们在下一节课上有一个 class Test { DUMMY_TYPE testVariable; } 虚拟_类型基于系统变量确定。因此,当Java编译时,是否可以让Java使用系统环境变量来确定编译类型的类型 另外,是否可以在Eclipse上以某种方式进行设置,在Eclipse中,无论我在哪里使用它,Eclipse都会继续在IDE上显示DUMMY_类型,但在编译和构建时,它可以根据

不确定我的措辞是否正确。如果您需要更多信息,请告诉我。 我们需要根据系统环境变量确定变量类型

那么,假设我们在下一节课上有一个

class Test
{
    DUMMY_TYPE testVariable;
}
虚拟_类型基于系统变量确定。因此,当Java编译时,是否可以让Java使用系统环境变量来确定编译类型的类型

另外,是否可以在Eclipse上以某种方式进行设置,在Eclipse中,无论我在哪里使用它,Eclipse都会继续在IDE上显示DUMMY_类型,但在编译和构建时,它可以根据环境变量用正确的类型替换DUMMY_类型?

我有一个想法

使
testVariable
类型为
Object
(或扩展
Object
DummyType
类)。然后,您可以根据从系统变量读取的内容,使用原始包装器类加载变量所需的任何数据

因此:

当然,这并不是Java在编译时“弄清楚”它是什么类型,就像您想要的那样(赋值将在运行时发生,当
Test
对象被创建时),但它似乎是一个合理的替代框架

当然,您也可以在初始化时设置
testVariable
的值

或者,您可以有这样一个方法,该方法将输入作为
字符串接受(从系统变量读取),并将其返回到原语类型的相应包装器类中:

public Object getPrimitiveValue(String type, String value) {
    if(type.equals("int")) {
        return new Integer(Integer.parseInt(value));
    }
    else if(type.equals("double")) {
        return new Double(Double.parseDouble(value));
    }
    //etc.
}

很酷的问题。出于好奇,你介意我问一下这是什么用例吗?简而言之,答案是否定的,但如果不知道你想做什么,就很难知道是否有合理的替代方案。这是API的一部分,在内部使用,通过套接字与专有系统交互。内部系统可以为同一个变量流化整数或双精度。它使用环境变量进行确定。因此,如果我们能够确定这一点,那么就不用在编译时维护单独的代码库,而是可以省去很多麻烦:)。我们在C++和C语言中实现了这一点,但是java给了我们一些悲哀,你需要的是一个预处理器![/me ducks]我还没有使用注释处理的源代码生成部分,但是我想您可以使用注释处理器来完成这项工作。注释处理器工具(APT)在编译之前运行,但在源代码解析之后运行,它允许您操作源代码。有谁能用一些具体的例子来扩展这个想法?我在想一个像
@ResolveType(“env_var_name”)objectobj这样的注释转换为
EnvVarValue obj。这似乎是一个合理的近似值。另外,由于类型是
整数
双精度
,超类可以是
数字
,而不是
对象
。Jeff,我们确实考虑过这一点。但是,我们在API中使用的库使用变量的原始版本。因此,我们无法为应用程序执行此操作。但我同意纳撒尼尔的观点,这绝对是一个可行的解决方案,没有我们的其他限制。谢谢。@user1524088由于自动取消装箱或显式调用
整数的
intValue()
方法(以及所有包装器类的类似方法),因此他们接受原语版本这一事实不应该成为问题。
public Object getPrimitiveValue(String type, String value) {
    if(type.equals("int")) {
        return new Integer(Integer.parseInt(value));
    }
    else if(type.equals("double")) {
        return new Double(Double.parseDouble(value));
    }
    //etc.
}