java - 我可以在不破坏向后兼容性的情况下将 Java 中的常量从 int 更改为 byte 吗?

标签 java casting backwards-compatibility primitive-types

我正在提交 changeJNA它在以前的版本中定义了一组常量作为 int 类型,具体来说:

int VER_EQUAL = 1;
int VER_GREATER = 2;
int VER_GREATER_EQUAL = 3;
... etc...

(因为它们是在 interface 中定义的,所以它们自动为 staticfinal。)

这些常量用作 VerSetConditionMask 中的 Condition 参数函数,它需要一个 BYTE 参数,在 JNA 中映射到 Java 的 byte

要在该函数中使用现有的 int 常量需要我(和其他用户)明确地对它们进行类型转换,所以我想将库中的这些常量值更改为 byte,例如,

byte VER_EQUAL = 1;
byte VER_GREATER = 2;
byte VER_GREATER_EQUAL = 3;
... etc...

我认为此更改不会破坏向后兼容性,因为任何使用这些常量的代码当前必须至少期望一个 int,并且会毫无怨言地愉快地加宽 byte。我写了很多测试代码来说服自己。我知道更改 Object 类型(如 IntegerByte)是行不通的,但我相信这对基元来说没问题。然而,尽管我在网上搜索了一个小时以进行确认,但我仍然有一点点不相信。

此更改是否向后兼容?还是我错了,在某些情况下这可能会破坏依赖于 int 原语的现有代码?

最佳答案

也许这是显而易见的。但也许不是。如果某些第三方用户获取了 int 值并将它们存储在本地 Integer 对象中,将 int 更改为 byte会在那里导致编译时错误:

interface IntToByteWithInt
{
    int VER_EQUAL = 1;
    int VER_GREATER = 2;
    int VER_GREATER_EQUAL = 3;
}

interface IntToByteWithByte
{
    byte VER_EQUAL = 1;
    byte VER_GREATER = 2;
    byte VER_GREATER_EQUAL = 3;
}

public class IntToByte
{
    public static void main(String[] args)
    {
        Integer a = IntToByteWithInt.VER_EQUAL;

        // Type mismatch: cannot convert from byte to Integer  
        Integer b = IntToByteWithByte.VER_EQUAL;
    }
}

除此之外,我认为至少应提及反射(reflection) 以确保完整性。

我还认为三元运算符 ( https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25.2 ) 是一个热门候选,但没有设法导致该运算符出错。

关于java - 我可以在不破坏向后兼容性的情况下将 Java 中的常量从 int 更改为 byte 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54082926/

相关文章:

java - 在项目上执行 sonarQube 的问题由 : java. lang.UnsupportedClassVersionError: org/sonarsource/scanner/maven/SonarQubeMojo 引起

java - 如何编写并行数组

c# - 在 C# 中到处转换( float )。只是 double 工作更好吗?

java - 无法定义和实例化 HashMap?

java - 使用正则表达式获取特殊字符之前的特定单词

java - 在 Android 中使用 Google map API V2 实现多边形

Java:在没有警告的情况下转换列表 <?>

c++ - 未使用的私有(private)虚拟方法是否允许在不破坏 ABI 兼容性的情况下进行 future 扩展?

c# - 验证公共(public) API 兼容性的工具

java - 具有Java向后兼容性的Kotlin optional 参数