假设我正在设计类似以下界面:
public interface MyInterface{
public MyInterface method1();
public void method2(MyInterface mi);
}
Run Code Online (Sandbox Code Playgroud)
但是,有一点需要注意,返回类型for method1
和参数method2
匹配具体实现而不仅仅是MyInterface
.也就是说,如果我有MyInterfaceImpl
这个实现MyInterface
,它需要具有以下内容:
public class MyInterfaceImpl implements MyInterface{
@Override
public MyInterfaceImpl method1(){...}
@Override
public void method2(MyInterfaceImpl mi){...}
}
Run Code Online (Sandbox Code Playgroud)
如上所述,method1
不会导致任何编译错误,但没有任何保证返回类型在所有实现中都匹配.当然method2
甚至不会编译,因为签名与接口不匹配.
一个候选解决方案是在泛型中使用自引用或递归边界:
public interface MyInterface<T extends MyInterface<T>>{
public T method1();
public void method2(T mi);
}
public class MyInterfaceImpl implements MyInterface<MyInterfaceImpl>{
@Override
public MyInterfaceImpl method1();
@Override
public void method2(MyInterfaceImpl mi);
}
Run Code Online (Sandbox Code Playgroud)
这将得到我想要的一个例外:其他实现可能会传递错误的泛型类型(没有任何力量T
来匹配具体类型).所以其他人可能会实现以下内容:
public class NotMyInterfaceImpl implements MyInterface<MyInterfaceImpl>{ …
Run Code Online (Sandbox Code Playgroud) 我已经在Smalltalk中编程了一段时间,但我从来没有真正需要接口来实现任何东西.那为什么Java等语言不能摆脱接口?它只是Smalltalk还是其他语言不需要接口?
在Java中的for-each循环中使用泛型时,我遇到了一个奇怪的编译器错误.这是一个Java编译器错误,还是我真的在这里遗漏了什么?
这是我的全班:
public class Generics<T extends Object> {
public Generics(T myObject){
// I didn't really need myObject
}
public List<String> getList(){
List<String> list = new ArrayList<String>();
list.add("w00t StackOverflow");
return list;
}
public static void main(String...a){
Generics generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨带有for-each的行:"类型不匹配无法从元素类型Object转换为String."
如果我进行这种微妙的改变,它会编译:
public static void main(String...a){
Generics<?> generics = new Generics(new Object());
for(String s : generics.getList()){
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道getList()
确实使用泛型,但它在我认为完全不相关的方式中使用它们.我可以理解这一点,如果我试图迭代T类型的东西并getList()
返回一个List<T>
或者什么东西,但事实并非如此.返回类型getList()
应该与T完全无关,不应该关心我是否使用我的Generics对象的原始类型......对吗?难道这些不完全无关,还是我真的在这里遗漏了什么?
请注意,如果我这样做,代码也会编译,我认为它应该与第一个相同:
public static …
Run Code Online (Sandbox Code Playgroud) 我正在尝试配置Ehcache(版本2.5),以便它永远不会忘记项目.我正在以编程方式配置,我没有触及任何配置XML文件.通过设置eternal
,true
我的理解是,如果我的磁盘空间不足或超出maxBytesLocalDisk
(或者如果应用程序终止),则可以从缓存中删除项目的唯一情况.但是,此测试程序未显示该行为:
public static void main(String[] args) {
CacheManager cacheManager = CacheManager.create();
Cache cache = new Cache(
new CacheConfiguration().name("test")
.overflowToDisk(true)
.eternal(true)
.maxBytesLocalHeap(1, MemoryUnit.MEGABYTES)
.overflowToOffHeap(false)
.maxBytesLocalDisk(100, MemoryUnit.GIGABYTES)
.maxElementsOnDisk(0)
.timeToIdleSeconds(0)
.timeToLiveSeconds(0)
.diskStorePath("E:\\Data\\Ehcache"));
cacheManager.addCache(cache);
for(int i = 0; i < 1000000; i++){
cache.put(new Element("key_" + i, "value_" + i));
}
System.out.println(cache.getSize());
}
Run Code Online (Sandbox Code Playgroud)
因此,在我的缓存中添加了100万个元素后,我告诉它溢出到一个数量级足够大的磁盘,最后我只得到了3276个项目.这里发生了什么?
我正在用Java创建一个神经网络,需要创建一个最初生成随机权重的方法.
我需要创建一个函数,它返回-1和1之间的随机double值,但不确定执行此操作的逻辑,因此任何帮助都将是最受欢迎的.
如果我在Eclipse中有一个Java项目,我可以右键单击一个方法名称和"Open Call Hierarchy".假设我有两个接口,A和B,它们都指定方法x().我是否有可能让Eclipse以更智能的方式使用"Open Call Hierarchy",以便只显示来自A的调用x()而不显示来自B的那些?
是否有一个内存高效的Java库来读取大型Microsoft Excel文件(.xls和.xlsx)?我对Apache POI的经验非常有限,而且我记得它似乎是一个巨大的记忆力(尽管这可能仅仅是为了写作而不是为了阅读).还有更好的东西吗?或者我错误地记住和/或滥用POI?
拥有"友好"的开源许可证对它来说很重要.
我有一个大表(大约1000万条记录),其中包含几个键到其他较小的表中.键在每个较小的表中都是唯一的,但在大表中则不是.我想根据键匹配从一个较小的表中向大表中添加一列,但我不确定"正确"的方法.我有一个有效的解决方案,但它需要相当长的时间(认为可能是不可避免的),并且通常不认为这是最佳的方式.这就是我所拥有的:
CREATE TABLE new_big_table LIKE big_table;
ALTER TABLE new_big_table ADD(new_column TINYINT NOT NULL);
INSERT INTO new_big_table SELECT big_table.*, smaller_table.my_column
FROM big_table JOIN smaller_table ON big_table.key1 = smaller_table.key1
AND big_table.key2 = smaller_table.key2;
Run Code Online (Sandbox Code Playgroud)
这可以完成工作,但它真的闻起来像我做错了.似乎至少我不需要创建表的副本来完成这项工作.有没有更直接(更有效?)的方式呢?
值得一提的是,这是针对家中的个人爱好项目,所以我可以自由地占用机器的所有资源(因为我是唯一使用它的人).因此,如果有做这样的事情的任何直接的性能优化技巧,我会很感激他们(我与这个实验在Amazon EC2实例,因为它应该是快了很多,并有比我的个人桌面更多内存) .
我正在探索帮助我的内存密集型应用程序的选项,在这样做时我遇到了Terracotta的BigMemory.从我收集的内容来看,它们利用了非垃圾收集的堆外"本机内存",显然由于序列化/反序列化问题,这比堆存储慢大约10倍.在阅读BigMemory之前,我从未听说过正常JNI之外的"本机记忆".尽管BigMemory是一个值得进一步考虑的有趣选项,但如果可以绕过序列化问题,我会对本机内存可以实现的内容感到好奇.
ByteBuffer
当没有序列化问题时(例如,如果我将它与巨大的比较),Java本机内存是否比传统堆内存更快(我认为这需要对象?byte[]
)?或者做垃圾收集的变幻莫测等让这个问题无法回答?我知道"测量它"是一个常见的答案,但我担心我不会建立一个代表性的测试,因为我还不太了解本机内存在Java中是如何工作的.
嗨,我是Web开发领域的一名新手。我想为管理员登录创建一个表,该表只有一个记录(因为只有一个管理员)。我想知道是否可以通过某种方式设置MySQL以将特殊表限制为仅包含一条记录?
在 R 包 lubridate 中,我可以使用以下语法轻松创建日期:
> mdy("5/4/2015")
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它产生以下结果:
[1] "2015-05-04 UTC"
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将该值添加到数组中,它似乎会从 UTC 更改为我的本地时间 (EDT):
> c(mdy("5/4/2015"))
[1] "2015-05-03 20:00:00 EDT"
Run Code Online (Sandbox Code Playgroud)
由于我不关心时间,这不会对我产生太大影响,只是这会导致日期向后移动 1,如下所示:
> day(mdy("5/4/2015"))
[1] 4
> day(c(mdy("5/4/2015")))
[1] 3
Run Code Online (Sandbox Code Playgroud)
对我来说,向数组添加一些东西的行为不应该改变那个东西的价值。我在这里遗漏了什么,有没有办法解决这个问题?
我正在为初学者编程课程做一些小程序,在我的程序中我有两个包含数字的变量.无论如何,我需要找出哪个数字更大并根据它打印相应的消息,例如我有:
int x = 5;
int y = 10;
Run Code Online (Sandbox Code Playgroud)
我需要打印:
"确实y大于x";
现在问题是,我知道我可以使用简单的if语句,但我不允许使用它,现在它让我想知道,它甚至可能吗?如果是这样,我该怎么做?如何检查哪个数字更大而不执行以下操作:
if (x > y)
answer = true;
Run Code Online (Sandbox Code Playgroud)
...
提前致谢.
java ×9
generics ×2
interface ×2
memory ×2
mysql ×2
bytebuffer ×1
caching ×1
date ×1
eclipse ×1
ehcache ×1
excel ×1
file-io ×1
foreach ×1
if-statement ×1
join ×1
lubridate ×1
r ×1
random ×1
raw-types ×1
restriction ×1
return-type ×1
row ×1
smalltalk ×1
sql ×1
terracotta ×1