小编Mic*_*wan的帖子

接口如何包含在其签名或返回类型中引用接口的具体实现类型的方法?

假设我正在设计类似以下界面:

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)

java generics interface return-type method-signature

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

为什么Java需要接口而Smalltalk不需要?

我已经在Smalltalk中编程了一段时间,但我从来没有真正需要接口来实现任何东西.那为什么Java等语言不能摆脱接口?它只是Smalltalk还是其他语言不需要接口?

java smalltalk interface

14
推荐指数
2
解决办法
2026
查看次数

为什么Java编译器抱怨使用带有原始类型的foreach?

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

java generics foreach raw-types

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

Ehcache设置为永恒,但无论如何都会忘记元素?

我正在尝试配置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 caching ehcache

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

获得-1到1之间的随机double值

我正在用Java创建一个神经网络,需要创建一个最初生成随机权重的方法.

我需要创建一个函数,它返回-1和1之间的随机double值,但不确定执行此操作的逻辑,因此任何帮助都将是最受欢迎的.

java random

7
推荐指数
2
解决办法
7055
查看次数

更智能的Eclipse"Open Call Hierarchy"?

如果我在Eclipse中有一个Java项目,我可以右键单击一个方法名称和"Open Call Hierarchy".假设我有两个接口,A和B,它们都指定方法x().我是否有可能让Eclipse以更智能的方式使用"Open Call Hierarchy",以便只显示来自A的调用x()而不显示来自B的那些?

java eclipse call-hierarchy

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

内存高效的Java库来读取Excel文件?

是否有一个内存高效的Java库来读取大型Microsoft Excel文件(.xls和.xlsx)?我对Apache POI的经验非常有限,而且我记得它似乎是一个巨大的记忆力(尽管这可能仅仅是为了写作而不是为了阅读).还有更好的东西吗?或者我错误地记住和/或滥用POI?

拥有"友好"的开源许可证对它来说很重要.

java memory excel file-io

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

适当的MySQL方法将列从一个表添加到另一个表

我有一个大表(大约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实例,因为它应该是快了很多,并有比我的个人桌面更多内存) .

mysql sql join sqlperformance

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

Java Native Memory比堆更快吗?

我正在探索帮助我的内存密集型应用程序的选项,在这样做时我遇到了Terracotta的BigMemory.从我收集的内容来看,它们利用了非垃圾收集的堆外"本机内存",显然由于序列化/反序列化问题,这比堆存储慢大约10倍.在阅读BigMemory之前,我从未听说过正常JNI之外的"本机记忆".尽管BigMemory是一个值得进一步考虑的有趣选项,但如果可以绕过序列化问题,我会对本机内存可以实现的内容感到好奇.

ByteBuffer当没有序列化问题时(例如,如果我将它与巨大的比较),Java本机内存是否比传统堆内存更快(我认为这需要对象?byte[])?或者做垃圾收集的变幻莫测等让这个问题无法回答?我知道"测量它"是一个常见的答案,但我担心我不会建立一个代表性的测试,因为我还不太了解本机内存在Java中是如何工作的.

java memory garbage-collection bytebuffer terracotta

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

是否可以限制一个表在mysql中只有一个记录?

嗨,我是Web开发领域的一名新手。我想为管理员登录创建一个表,该表只有一个记录(因为只有一个管理员)。我想知道是否可以通过某种方式设置MySQL以将特殊表限制为仅包含一条记录?

mysql row restriction

5
推荐指数
2
解决办法
8276
查看次数

将 lubridate 日期添加到矢量更改时区,从而更改日期

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

对我来说,向数组添加一些东西的行为不应该改变那个东西的价值。我在这里遗漏了什么,有没有办法解决这个问题?

r date lubridate

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

是否有可能在不使用if语句的情况下找出哪个数字更大?

我正在为初学者编程课程做一些小程序,在我的程序中我有两个包含数字的变量.无论如何,我需要找出哪个数字更大并根据它打印相应的消息,例如我有:

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 if-statement

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