我正在提交 change至 JNA它在以前的版本中定义了一组常量作为 int
类型,具体来说:
int VER_EQUAL = 1;
int VER_GREATER = 2;
int VER_GREATER_EQUAL = 3;
... etc...
(因为它们是在 interface
中定义的,所以它们自动为 static
和 final
。)
这些常量用作 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
类型(如 Integer
到 Byte
)是行不通的,但我相信这对基元来说没问题。然而,尽管我在网上搜索了一个小时以进行确认,但我仍然有一点点不相信。
此更改是否向后兼容?还是我错了,在某些情况下这可能会破坏依赖于 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/