我在eclipse(最新版本)中收到以下代码的警告.
public interface A<T> extends B<T> {
public T getObject();
}
Run Code Online (Sandbox Code Playgroud)
警告出现在'A'中的'T'处,并显示:"类型参数T隐藏类型T".
奇怪的是,以下代码不会生成任何错误或警告.
public interface A extends B<T> {
public T getObject();
}
Run Code Online (Sandbox Code Playgroud)
但是现在我不能在告诉它T是什么类型时扩展A.
我完全糊涂了.任何人都知道为什么会这样吗?谢谢.
我似乎无法找到任何地方如何捕获并重新抛出过程中可能发生的任何错误或警告.
我想要的是执行以下操作的语法:
create procedure myProcedure()
begin
declare exit handler for ANYTHING_WRONG_THAT_CAN_BE_CAUGHT_WARNINGS_INCLUDED
begin
rollback;
RE_THROW THE_THING_THAT_WAS_CAUGHT;
end;
start transaction;
-- do some stuff
commit;
end; //
Run Code Online (Sandbox Code Playgroud)
原因是我想强制对错误或警告进行回滚,而是将其留给客户端来决定如何处理特定错误.
全部区域是我不知道放什么的部分.
谢谢你的帮助!
编辑-------
我已经知道我不可能做我所问的:'(.
相反,对于出错的任何内容我都会遇到一个错误并使用以下代码:
declare exit handler for sqlwarning, sqlexception begin
rollback;
call error();
end;
Run Code Online (Sandbox Code Playgroud)
(error()不存在)
我试图准确理解元素可见性如何在java中的数组上工作.
鉴于课程:
class IntList {
private final int[] array;
public IntList(int[] array) {
this.array = array;
}
public int[] readElements() {
return Arrays.copyof(this.array, this.array.length);
}
}
Run Code Online (Sandbox Code Playgroud)
以及用于创建实例的以下方法体:
int[] array = new int[length];
fillArrayWithRandomData(array); // puts data into the array from arbitrary source
return new IntList(array);
Run Code Online (Sandbox Code Playgroud)
我想知道是否IntList
保证其他线程可以看到元素获取对返回的引用IntList
?
我确信数组的参考将是可见的,因为它是最终的,但我似乎无法保证数组中的元素也是可见的.
注意:IntList
该类没有允许修改数组的方法,并且数组引用未发布到任何其他对象,我只是想知道构造后的可见性.
编辑:对不起,String
在我的实际实现中没有调用我的类.我改变了类名,IntList
因为似乎有太多的混乱.
编辑:
我将在这里放置的最终答案是肯定的,元素是可见的.
@MikeClark找到了JLS答案:JLS§17.5"最终字段的使用模型很简单:在该对象的构造函数中设置对象的最终字段;并且不要在另一个地方写入正在构造的对象的引用线程可以在对象的构造函数完成之前看到它.如果这样,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本.它还将看到任何对象的版本或由最终字段引用的数组,这些字段至少与最终字段一样是最新的."
再次感谢!
我有一段代码可以从队列中获取所有元素.之后我不关心队列的状态,我可以确保在从中删除元素时不会修改队列.
我最初使用迭代器来拉取元素因为我认为它比轮询元素更快...
但我跑了以下测试:
ConcurrentLinkedQueue<Object> queue = new ConcurrentLinkedQueue<>();
for (int i=0; i < 1000000; i++)
queue.add(new Object());
LinkedList<Object> list = new LinkedList<>();
long start = System.currentTimeMillis();
for (Object object: queue)
list.add(object);
long time1 = System.currentTimeMillis() - start;
list = new LinkedList<>();
start = System.currentTimeMillis();
Object object;
while ((object = queue.poll()) != null)
list.add(object);
long time2 = System.currentTimeMillis() - start;
System.out.println(time1 + " " + time2);
Run Code Online (Sandbox Code Playgroud)
我得到以下输出(平均超过100次运行)
1169 46
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么民意调查比迭代更快?这对我来说完全不直观,因为poll必须修改队列,迭代只需要查看状态.
编辑---格雷是对的
我在一个循环中运行它并获得输出(应该首先完成此操作)
1180 46
1422 25
287 32
14 26
226 …
Run Code Online (Sandbox Code Playgroud) 对于以下简化类:
public class MutableInteger {
private int value;
public MutableInteger(int initial) {
synchronized(this) { // is this necessary for memory visibility?
this.value = initial;
}
}
public synchronized int get() {
return this.value;
}
public synchronized void increment() {
this.value++;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想一般的问题是同步保护的可变变量是否需要在构造函数中设置初始值时进行同步?
就浏览器缓存和网站seo而言,这两个URL是否等效?
1 - http://example.com/resource.html?a=a&b=b
2 - http://example.com/resource.html?b=b&a=a
Run Code Online (Sandbox Code Playgroud)
如果第一个URL的资源被缓存,并且浏览器需要找到第二个URL的资源,它可以使用缓存的资源吗?我想了解有关缓存的信息,因为我可以确保所有内部链接使用相同的参数顺序来提高缓存性能。
另外,如果我的服务器将这些网址视为相同的资源,那么Google将为哪个网址建立索引?考虑到SEO,这将算作重复内容吗?如果是这样,我可以使用301响应重定向到正确的URL。(这也应该解决缓存问题。)
它让我从Serializable
界面的启动中感到困惑,为什么我必须在我的所有课程中加入这个领域.我知道这个接口需要一个唯一的标识符来标记类,但为什么它们不能在运行时生成它.例如,他们可以使用完全限定类名的MD5哈希或者用于处理罕见事件中的重复项的类似方法来生成它(也就是说,我确定,当被要求生成id时,eclipse会做什么).
所以我要问的是(这篇文章不仅仅是对标准库的咆哮)究竟是如何使用框架化序列化字段的?
我想知道的原因是因为我将尝试创建一个Aspect(使用AspectJ或其他语言),它将使用MD5哈希添加serialVersionUID字段,并且能够以API可接受的方式处理冲突.
如果我能让它发挥作用,我会发布结果.
说我有一个方法:
public String getString() {
char[] array = new char[]{'a', 'b', 'c'};
return new String(array);
}
Run Code Online (Sandbox Code Playgroud)
数组是否仍然在String构造函数中复制,或者Java编译器是否足够智能,以识别数组中的元素不能更改,因此它只能引用数组?
谢谢