这个程序在Java 7(或Java 8中-source 7
)编译得很好,但是无法用Java 8编译:
interface Iface<T> {}
class Impl implements Iface<Impl> {}
class Acceptor<T extends Iface<T>> {
public Acceptor(T obj) {}
}
public class Main {
public static void main(String[] args) {
Acceptor<?> acceptor = new Acceptor<>(new Impl());
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
Main.java:10: error: incompatible types: cannot infer type arguments for Acceptor<>
Acceptor<?> acceptor = new Acceptor<>(new Impl());
^
reason: inference variable T has incompatible bounds
equality constraints: Impl
upper bounds: Iface<CAP#1>,Iface<T>
where T is a type-variable:
T …
Run Code Online (Sandbox Code Playgroud) 我很好奇-什么是通用型的点U
在声明Traversable
的foreach
方法是什么?
def foreach[U](f: A => U): Unit
Run Code Online (Sandbox Code Playgroud)
由于返回类型Function1
是协变的,为什么不能只是:
def foreach(f: A => Any): Unit
Run Code Online (Sandbox Code Playgroud)
?
每个Gradle任务都具有inputs
类型属性TaskInputs
,表示任务的输入文件集合.这主要用于识别任务是最新的.但是,一些输入文件也标记为源文件 - 这是什么意思?换句话说,任务输入文件和任务源文件有什么区别?
我一般都是钢筋和二郎的初学者.我试图根据本教程创建一个带有钢筋的erlang版本:http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades并且在运行生成的版本时陷入困境.
我的系统是Ubuntu 11.04 64bit,erlang R14B03,从源头安装.
当我调用'bin/somenode console'时,我收到以下错误之一:
Exec: /home/ghik/Inz/somerel/rel/somenode/erts-5.8.4/bin/erlexec -boot /home/ghik/Inz/somerel/rel/somenode/releases/1/somenode -mode embedded -config /home/ghik/Inz/somerel/rel/somenode/etc/app.config -args_file /home/ghik/Inz/somerel/rel/somenode/etc/vm.args -- console
Root: /home/ghik/Inz/somerel/rel/somenode
{"init terminating in do_boot",{'cannot load',hipe_amd64_encode,get_files}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
Run Code Online (Sandbox Code Playgroud)
有趣的是,每次运行它时,都会列出不同的原子而不是'hipe_amd64_encode',例如:'hipe_amd64_defuse','hipe_amd64_assemble'等等.我猜测erlang无法加载hipe,但我不知道为什么是试图加载它的第一个地方.该版本仅包含一个非常简单的应用程序,仅依赖于内核和stdlib.
出于某种原因,rebar会生成一个带有大量不必要应用程序的.rel文件:
%% rel generated at {2011,9,6} {20,5,48}
{release,{"somenode","1"},
{erts,"5.8.4"},
[{kernel,"2.14.4"},
{stdlib,"1.17.4"},
{sasl,"2.1.9.4"},
{someapp,"1"},
{compiler,"4.7.4",load},
{crypto,"2.0.3",load},
{et,"1.4.3",load},
{gs,"1.5.13",load},
{hipe,"3.8",load},
{inets,"5.6",load},
{mnesia,"4.4.19",load},
{observer,"0.9.9",load},
{public_key,"0.12",load},
{runtime_tools,"1.8.5",load},
{ssl,"4.1.5",load},
{syntax_tools,"1.6.7.1",load},
{tools,"2.6.6.4",load},
{webtool,"0.8.8",load},
{wx,"0.98.10",load}]}.
Run Code Online (Sandbox Code Playgroud)
为什么rebar列表会在.rel文件中列出很多应用程序?事件如果没问题,为什么不发布?
让我们假设将这两个等价表达式传递给Scala宏:
1+"foo"
any2stringadd(1)+"foo"
有没有办法在宏内区分这两个?
为什么这不编译?
trait Lol[A, SA] {
def flatMap[B, SB](f: A => Lol[B, SB]): Lol[B, SB] = ???
}
val p1: Lol[Int, String] = ???
val p2: Lol[Double, Nothing] = ???
val p5 = p1.flatMap(_ => p2)
Run Code Online (Sandbox Code Playgroud)
结果:
found : Int => Lol[Double,Nothing]
required: Int => Lol[Double,SB]
val p5 = p1.flatMap(_ => p2)
^
Run Code Online (Sandbox Code Playgroud)
事情开始编译时:
flatMap
调用参数是显式的SA
是协变的(wtf?)Nothing
使用的其他类型p2
Null
SB
在返回类型中不会发生flatMap
或在该返回类型的协变位置发生(例如返回类型Option[SB]
)但是,上述解决方法对我来说是不可接受的.
如何NumberLong
使用mongoimport
?导入MongoDB ?
不幸的是,json文件中的这些条目会导致错误:
{"_id": NumberLong(123)}
{"_id": NumberLong("123")}
Run Code Online (Sandbox Code Playgroud)
结果:
Mon Nov 12 14:41:46 Assertion: 10340:Failure parsing JSON string near: "_id": Num
0xaf6b21 0xabe459 0xabe5dc 0x7b93ad 0x56160d 0x5630f4 0xabb412 0x5546bc 0x7f961b79776d 0x554549
mongoimport(_ZN5mongo15printStackTraceERSo+0x21) [0xaf6b21]
mongoimport(_ZN5mongo11msgassertedEiPKc+0x99) [0xabe459]
mongoimport() [0xabe5dc]
mongoimport(_ZN5mongo8fromjsonEPKcPi+0x56d) [0x7b93ad]
mongoimport(_ZN6Import8parseRowEPSiRN5mongo7BSONObjERi+0xa2d) [0x56160d]
mongoimport(_ZN6Import3runEv+0x1314) [0x5630f4]
mongoimport(_ZN5mongo4Tool4mainEiPPc+0x1712) [0xabb412]
mongoimport(main+0x2c) [0x5546bc]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7f961b79776d]
mongoimport(__gxx_personality_v0+0x419) [0x554549]
Mon Nov 12 14:41:46 exception:BSON representation of supplied JSON is too large: Failure parsing JSON string near: "_id": Num
Mon Nov 12 14:41:46
Mon Nov 12 …
Run Code Online (Sandbox Code Playgroud) 我试图强迫Gradle以我自己的方式创建jar.我编写了自己的Gradle任务(单独的类)来执行此操作,现在我想jar
用它替换默认任务,以便:
jar
任务生成jar
任务相同 - 它取决于classes
任务,build
任务使用它等.UP-TO-DATE
(就像默认的那样jar
)我正在努力做到这一点,我在实现这一点上遇到了很多麻烦.例如,我无法强制build
任务始终使用我的新任务.
如果有人能用简短的方法支持我,我将非常感激.
假设一个像这样的项目布局:
allprojects {
apply plugin: "java"
configurations {
provided
compile.extendsFrom(provided)
}
}
project("a") {
dependencies {
compile("foo:bar:1.0")
...
provided("bar:baz:3.14")
...
}
}
project("b") {
dependencies {
compile("abc:def:1.0")
...
provided("xyz:foo:3.14")
...
}
}
dependencies {
compile(project(":a"))
compile(project(":b"))
}
Run Code Online (Sandbox Code Playgroud)
现在,我需要一个任务,将根项目的所有依赖项(传递)复制到某个目录,但不包括provided
配置.我怎样才能做到这一点?
在Java中,我做了很多数据集成工作.一直出现的一件事是在多个系统之间映射数据.所以我经常做这样的事情
public enum DataField{
Field1("xmlField", "dbField", "system1Field";
private String xml;
private String db;
private String sys;
private DataField(String xml, String db, String sys){
this.xml = xml;
this.db = db;
this.sys = sys;
}
public getXml(){
return this.xml;
}
public static DataField valueOfXml(String xml){
for (DataField d : this.values()){
if (d.xml.equals(xml)){ return d;}
}
}
bla, bla bla
}
Run Code Online (Sandbox Code Playgroud)
这允许我做的是将字段名称DataField放在我的所有消息中,并能够映射在多个系统中调用该字段的内容.所以在我的XML中,它可能firstname
在我的数据库中被调用,first_name
但在我的外部接口系统中,它可能被调用first
.这种模式非常好地将所有这些结合在一起,并且以紧凑,类型安全的方式使这些类型的系统中的消息传递变得非常容易.
现在我不记得为什么Scala改变了枚举实现,但我记得当我读它时它是有意义的.但问题是,我将在Scala中使用什么来取代这种设计模式?我讨厌失去它,因为它对我在某一天写的很多系统都非常有用和基础.
谢谢
scala ×4
gradle ×3
generics ×2
erlang ×1
foreach ×1
hipe ×1
java ×1
java-8 ×1
mongodb ×1
mongoimport ×1
rebar ×1
scala-2.10 ×1
scala-macros ×1
types ×1