小编ghi*_*hik的帖子

为什么这个Java 8程序无法编译?

这个程序在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)

java generics type-inference java-8

77
推荐指数
3
解决办法
2万
查看次数

foreach中泛型类型的重点是什么?

我很好奇-什么是通用型的点U在声明Traversableforeach方法是什么?

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)

generics foreach types scala

20
推荐指数
1
解决办法
871
查看次数

任务输入与任务源

每个Gradle任务都具有inputs类型属性TaskInputs,表示任务的输入文件集合.这主要用于识别任务是最新的.但是,一些输入文件也标记为文件 - 这是什么意思?换句话说,任务输入文件和任务源文件有什么区别?

gradle

12
推荐指数
1
解决办法
938
查看次数

无法启动使用钢筋生成的样本erlang版本

我一般都是钢筋和二郎的初学者.我试图根据本教程创建一个带有钢筋的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文件中列出很多应用程序?事件如果没问题,为什么不发布?

erlang hipe rebar

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

如何区分编译器推断的隐式转换与显式调用的转换?

让我们假设将这两个等价表达式传递给Scala宏:

  • 使用编译器推断的隐式转换: 1+"foo"
  • 使用显式调用的隐式转换: any2stringadd(1)+"foo"

有没有办法在宏内区分这两个?

scala implicit-conversion scala-2.10 scala-macros

8
推荐指数
1
解决办法
288
查看次数

Bizzare类型推理限制 - 多种类型的参数

为什么这不编译?

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使用的其他类型p2Null
  • SB在返回类型中不会发生flatMap或在该返回类型的协变位置发生(例如返回类型Option[SB])

但是,上述解决方法对我来说是不可接受的.

scala type-inference

8
推荐指数
1
解决办法
186
查看次数

将长值导入mongodb

如何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)

mongodb mongoimport

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

如何正确替换Gradle'jar'任务?

我试图强迫Gradle以我自己的方式创建jar.我编写了自己的Gradle任务(单独的类)来执行此操作,现在我想jar用它替换默认任务,以便:

  • 存档总是使用我的新任务生成,而且永远不会使用旧jar任务生成
  • 我的新任务与其他任务的关系与默认jar任务相同 - 它取决于classes任务,build任务使用它等.
  • 我希望我的任务不被调用UP-TO-DATE(就像默认的那样jar)

我正在努力做到这一点,我在实现这一点上遇到了很多麻烦.例如,我无法强制build任务始终使用我的新任务.

如果有人能用简短的方法支持我,我将非常感激.

gradle

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

复制依赖项,不包括某些配置

假设一个像这样的项目布局:

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配置.我怎样才能做到这一点?

gradle

3
推荐指数
1
解决办法
4670
查看次数

我一直在使用Scala替换Java枚举模式

在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

3
推荐指数
1
解决办法
300
查看次数