可能重复:
java Enum定义
更好的公式化问题,不被认为是重复的:
如果Enum声明没有递归部分,那么在Java中会有什么不同
如果语言设计师只使用Enum <E extends Enum>会对语言产生什么影响呢?
现在唯一的区别就是有人会写作
A extends Enum<B>
但是因为在java中不允许扩展枚举仍然是非法的.我也在想有人为jvm提供一个字节码,将字符串定义为扩展枚举 - 但是泛型不会影响它,因为它们都被删除了.
那么宣言的重点是什么呢?
谢谢!
编辑 为简单起见,让我们来看一个例子:
interface MyComparable<T> {
int myCompare(T o);
}
class MyEnum<E extends MyEnum> implements MyComparable<E> {
public int myCompare(E o) { return -1; }
}
class FirstEnum extends MyEnum<FirstEnum> {}
class SecondEnum extends MyEnum<SecondEnum> {}
这个类结构有什么问题?可以做些什么"MyEnum <E扩展MyEnum <E >>"会限制?
请参阅 Java Enum定义 和 为什么在java enum中声明为Enum <E extends Enum <E >> 进行一般性讨论.如果Enum类被定义为,我想知道究竟会破坏什么(不再是类型安全,或者需要额外的强制转换等)
public class Enum<E extends Enum>
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码来测试我的想法:
interface MyComparable<T> {
int myCompare(T o);
}
class MyEnum<E extends MyEnum> implements MyComparable<E> {
public int myCompare(E o) { return -1; }
}
class FirstEnum extends MyEnum<FirstEnum> {}
class SecondEnum extends MyEnum<SecondEnum> {}
Run Code Online (Sandbox Code Playgroud)
有了它,我无法在这个确切的情况下找到任何好处.
PS.我不被允许做的事实
class ThirdEnum extends MyEnum<SecondEnum> {}
Run Code Online (Sandbox Code Playgroud)
当使用递归定义MyEnum时
a)不相关,因为使用真实的枚举你不能仅仅因为你不能自己扩展枚举
b)不是真的 - 请在编译器中尝试它并看到它实际上是能够编译没有任何错误
PPS.我越来越倾向于相信这里的正确答案是"如果你移除递归部分,没有什么会改变" - 但我简直无法相信.
我有一个在统一的java进程网格上运行的应用程序(可能在不同的物理机器上).我想从这个应用程序的单次运行中收集cpu使用情况统计信息.我已经查找了分析工具,寻找自动收集数据的选项,但未能在netbeans,tptp,jvisualvm,yourkit等中找到任何内容.
也许我看错了路?
我在想的是:
但我找不到任何与此类似的东西.
有什么想法,经验和建议吗?
谢谢!
在Java中给出以下内容:
String a = "str";
CharSequence b = "charseq";
Run Code Online (Sandbox Code Playgroud)
你可以写
b = b + a;
Run Code Online (Sandbox Code Playgroud)
但无法编写(产生编译器错误)
b += a;
Run Code Online (Sandbox Code Playgroud)
错误是
incompatible types
found : java.lang.CharSequence
required: java.lang.String
Run Code Online (Sandbox Code Playgroud)
现在在JLS第二版中,这可以通过15.26.2复合赋值运算符的这一行来解释:
All compound assignment operators require both operands to be of primitive type, except for +=, which allows the right-hand operand to be of any type if the left-hand operand is of type String.
但是在JLS第三版中,该注释消失了,关于复合运算符的唯一说明是在15.26.2复合赋值运算符:
A compound assignment expression of the form E1 op= E2 is equivalent to E1 …
我想跑
liquibase update
Run Code Online (Sandbox Code Playgroud)
在尚不存在的数据库上.我希望它为我创建数据库(我用root运行,所以它不应该是一个问题),但我得到了:
/vagrant/liquibase$ ./liquibase update
Liquibase Home is not set.
Liquibase Home: /vagrant/liquibase
Liquibase update Failed: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test_project'
Run Code Online (Sandbox Code Playgroud) 我可能做错了什么,因为我使用buildr的时间不长,所以欢迎所有评论.
我的项目结构是:
define :proj do
define :web do
task :run do
# runs the web part of the project in a jetty
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,如果我想开始我的项目,我必须输入
buildr proj:web:run
Run Code Online (Sandbox Code Playgroud)
我想打字简单
buildr run
Run Code Online (Sandbox Code Playgroud)
代替.我如何实现这一目标?
我正在尝试使用Liquibase来创建一个已经有多个SQL changelog文件的项目(以前是手工维护的).使用stackoverflow上某处的建议我添加了一个
<includeAll path="db/initial"/>
Run Code Online (Sandbox Code Playgroud)
我的初始更改日志文件的指令,但它失败了一个非常有用
您的SQL语法中有错误
信息.玩弄我发现问题在于文件中有多个sql语句.只要我提供了一个只有一个语句的文件就行了.
那么如何告诉Liquibase从sql文件执行多个语句?
@ThreadSafe
public class SynchronizedInteger {
@GuardedBy("this") private int value;
public synchronized int get() { return value; }
public synchronized void set(int value) { this.value = value; }
}
Run Code Online (Sandbox Code Playgroud)
这本书说:
考虑volatile变量的好方法是想象它们的行为大致类似于清单3.3中的SynchronizedInteger类,用get和set调用替换volatile变量的读写.
......
这个比喻并不准确; SynchronizedInteger的内存可见性效果实际上比volatile变量略强.见第16章.
我检查了第16章,但没有找到确切的答案 - 内存可见性保证的确切程度如何更强?