小编ata*_*mur的帖子

为什么在java enum中声明为Enum <E extends Enum <E >>

可能重复:
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 enums

37
推荐指数
1
解决办法
2万
查看次数

如果Enum声明没有递归部分,Java会有什么不同

请参阅 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 generics enums

14
推荐指数
1
解决办法
3069
查看次数

如何在java中分析分布式应用程序?

我有一个在统一的java进程网格上运行的应用程序(可能在不同的物理机器上).我想从这个应用程序的单次运行中收集cpu使用情况统计信息.我已经查找了分析工具,寻找自动收集数据的选项,但未能在netbeans,tptp,jvisualvm,yourkit等中找到任何内容.

也许我看错了路?

我在想的是:

  • 使用一些特殊的设置运行网格上的进程,允许它们转储分析信息
  • 像往常一样运行我的应用程序 - 它会将任务推送到网格,进程将执行任务并发布分析信息
  • 使用一些工具来收集和分析分析结果

但我找不到任何与此类似的东西.

有什么想法,经验和建议吗?

谢谢!

java profiling distributed

11
推荐指数
1
解决办法
1163
查看次数

JLS如何与Sun javac对应/为什么不匹配

在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 …

java javac jls

4
推荐指数
1
解决办法
201
查看次数

Liquibase拒绝创建不存在的数据库

我想跑

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)

mysql liquibase

4
推荐指数
1
解决办法
3204
查看次数

如何在buildr中为任务设置别名

我可能做错了什么,因为我使用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)

代替.我如何实现这一目标?

java buildr

3
推荐指数
1
解决办法
312
查看次数

Liquibase导入mysql的sql文件在多个语句上失败

我正在尝试使用Liquibase来创建一个已经有多个SQL changelog文件的项目(以前是手工维护的).使用stackoverflow上某处的建议我添加了一个

<includeAll path="db/initial"/>
Run Code Online (Sandbox Code Playgroud)

我的初始更改日志文件的指令,但它失败了一个非常有用

您的SQL语法中有错误

信息.玩弄我发现问题在于文件中有多个sql语句.只要我提供了一个只有一个语句的文件就行了.

那么如何告诉Liquibase从sql文件执行多个语句?

mysql liquibase

2
推荐指数
1
解决办法
4334
查看次数

评论"实践中的并发"

@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章,但没有找到确切的答案 - 内存可见性保证的确切程度如何更强?

java concurrency multithreading

1
推荐指数
1
解决办法
154
查看次数