关于lambdas及其相关的异常签名,我有一个关于Java 8推断的问题.
如果我定义一些方法foo:
public static <T> void foo(Supplier<T> supplier) {
//some logic
...
}
Run Code Online (Sandbox Code Playgroud)
然后,我得到了foo(() -> getTheT());在大多数情况下能够为给定的内容编写的漂亮而简洁的语义T.但是,在此示例中,如果我的getTheT操作声明了它throws Exception,我的foo方法使得供应商不再编译:供应商方法签名get不会抛出异常.
这似乎是解决这个问题的一个不错的方法是重载foo以接受任一选项,重载定义为:
public static <T> void foo(ThrowingSupplier<T> supplier) {
//same logic as other one
...
}
Run Code Online (Sandbox Code Playgroud)
其中ThrowingSupplier定义为
public interface ThrowingSupplier<T> {
public T get() throws Exception;
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我们有一个引发异常的供应商类型和一个不引发异常的供应商类型.所需的语法将是这样的:
foo(() -> operationWhichDoesntThrow()); //Doesn't throw, handled by Supplier
foo(() -> operationWhichThrows()); //Does throw, handled by ThrowingSupplier
Run Code Online (Sandbox Code Playgroud)
但是,这会导致问题,因为lambda类型不明确(可能无法在Supplier和ThrowingSupplier之间解决).做一个明确的演员foo((ThrowingSupplier)(() -> operationWhichThrows()));可以工作,但它摆脱了所需语法的大部分简洁性.
我想基本的问题是:如果Java编译器能够解决我的一个lambdas由于它在仅供应商案例中抛出异常而不兼容的事实,为什么它不能使用相同的信息来导出二级,类型推理案例中lambda的类型?
任何人都可以指出的任何信息或资源同样值得赞赏,因为我不太确定在哪里可以找到有关此事的更多信息. …
前段时间,我决定升级到GCC 4.8,以便尽早开始使用某些c ++ 11功能.不过,我有点偏执,并且在几天前的一个项目之前没有真正使用任何新功能(新编译器似乎工作正常,但可能只是因为我没有使用任何新功能.)
在这个新项目中,当我用= std = c ++ 11标志编译时,我没有遇到任何问题.但是,在运行时,我收到错误:
./main: /usr/lib/i386-linux-gnu/libstdc++.so.6: version找不到GLIBCXX_3.4.18'(./ main要求)`
我认为链接到与GCC 4.8相关联的更现代的libstdc ++库存在问题,但我不能在我的生活中弄清楚如何解决这个或适当的库应该在哪里.我记得象征性地将g ++和gcc二进制文件链接到gcc-4.8,它似乎正在工作,因为g++ -v返回:
Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/app/gcc/4.8.0/libexec/gcc/i686-pc-linux-gnu/4.8.0/lto-wrapper Target: i686-pc-linux-gnu Configured with: ./gcc-4.8.0/configure --prefix=/app/gcc/4.8.0 Thread model: posix gcc version 4.8.0 (GCC)
另一个在线线程让我看看ldd程序的输出,它确实告诉我链接的libstdc ++库的目录结构与二进制文件的目录结构不同.但是,我无法libstdc++在后者中找到合适的库,所以我不确定在哪里查看.输出ldd main是:
./main: /usr/lib/i386-linux-gnu/libstdc++.so.6: version找不到GLIBCXX_3.4.18'(./main要求)linux-gate.so.1 =>(0xb7791000)libstdc ++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6(0xb768e000 )libm.so.6 => /lib/i386-linux-gnu/libm.so.6(0xb7662000)libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1(0xb7644000)libc .so.6 => /lib/i386-linux-gnu/libc.so.6(0xb749b000)/lib/ld-linux.so.2(0xb7792000)`
我不确定这到底出了什么问题,我会继续谷歌搜索并寻找答案,但是你们提供的任何帮助都将不胜感激.如果有任何问题不清楚或者我忘了一些信息,请告诉我,我会尝试添加它.非常感谢!
我正在使用一个简单的Jena数据集,它只导入了一个~30 MB的RDF文件.作为应用程序的一部分,我试图让用户查询默认图形(或命名图形),并将查询中生成的三元组插入到新的命名图形中.为此,我使用CONSTRUCT语句以RDF形式构成三元组的结果集,然后将这些三元组放入新模型(使用QueryExecution.execConstruct())并将此模型添加到数据集中.这似乎再次起作用,因为数据集获得了一个新的图形节点,并且TDB数据库文件夹的磁盘大小也在增大.
当我尝试从数据集中删除命名图时,会出现此问题.使用数据集的removeNamedName("graphName")方法,我从数据集中删除模型.对该模型名称的未来查询表明它已成功删除.但是,即使在同步和退出后,TDB数据库文件夹的磁盘大小仍保持相同的大小.
起初我想也许数据库只是将已删除文件的空间标记为空闲,以便在新数据进入时可以覆盖它,但似乎并非如此.如果我删除一个命名图并在同一个程序运行后立即替换它,该文件夹似乎没有增长,但如果我添加一个新的命名图并在同一个运行中删除它,文件夹大小会变大,模型删除不会释放内存,这意味着在几次运行后,数据库文件夹的大小是原始大小的五倍或十倍,而不再保留任何数据.
任何见解或帮助都会很棒,再次感谢.