我有一个Scala 2.9编译器插件(源代码),在2.9中运行得很好但是甚至不用2.10编译.有许多(可能是100多个)错误都属于同一类,例如:
[scalac] C:\***.scala:31: error: illegal cyclic reference involving class Global
[scalac] val fileSeparator = System.getProperty("file.separator");
[scalac] ^
Run Code Online (Sandbox Code Playgroud)
......最终终止于:
[scalac] scala.reflect.internal.Types$TypeError: illegal cyclic reference involving class Global
[scalac] at scala.reflect.internal.Types$class.defineBaseClassesOfCompoundType(Types.scala:1731)
[scalac] at scala.reflect.internal.SymbolTable.defineBaseClassesOfCompoundType(SymbolTable.scala:12)
[scalac] at scala.reflect.internal.Types$CompoundType.baseClasses(Types.scala:1581)
[scalac] at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2369)
[scalac] at scala.reflect.internal.Types$SimpleTypeProxy$class.baseClasses(Types.scala:248)
[scalac] at scala.reflect.internal.Types$SingletonType.baseClasses(Types.scala:1292)
[scalac] at scala.reflect.internal.Types$Type.findMembers(Types.scala:1058)
[scalac] at scala.reflect.internal.Types$Type.membersBasedOnFlags(Types.scala:683)
[scalac] at scala.reflect.internal.Types$Type.implicitMembers(Types.scala:637)
[scalac] at scala.tools.nsc.typechecker.Contexts$Context.collect$1(Contexts.scala:630)
[scalac] at scala.tools.nsc.typechecker.Contexts$Context.collectImplicitImports(Contexts.scala:642)
[scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:670)
[scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
[scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
[scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
[scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
[scalac] at scala.tools.nsc.typechecker.Contexts$Context.implicitss(Contexts.scala:675)
[scalac] at …Run Code Online (Sandbox Code Playgroud) 我有一个函数有两个参数列表,我试图部分应用和currying使用.第二个参数列表包含所有都具有默认值(但不是隐式)的参数.像这样的东西:
def test(a: Int)(b: Int = 2, c: Int = 3) { println(a + ", " + b + ", " + c); }
Run Code Online (Sandbox Code Playgroud)
现在,以下几点都很好:
test(1)(2, 3);
test(1)(2);
test(1)(c=3);
test(1)();
Run Code Online (Sandbox Code Playgroud)
现在,如果我定义:
def partial = test(1) _;
Run Code Online (Sandbox Code Playgroud)
然后可以完成以下操作:
partial(2, 3);
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么我不能省略'部分'中的一些/所有参数,如下所示:
partial(2);
partial(c=3);
partial();
Run Code Online (Sandbox Code Playgroud)
不应该写"部分"的行为与"test(1)"的行为基本相同吗?有人可以帮我找出实现这个目标的方法吗?
请帮忙,我很绝望!
编辑 - 由于我无法在24小时内回答我自己的问题,我将在此发表自己的答案:
到目前为止,这是我能做的最好的事情:
class Test2(val a: Int) {
def apply(b: Int = 2, c: Int = 3) { println(a + ", " + b + ", " + c); }
}
def test2(a: Int) …Run Code Online (Sandbox Code Playgroud) 我们需要将JavaDoc作为站点而不是存档发布到我们的maven存储库,以便可以直接从那里浏览它.我们基于maven的项目已经实现了这一点,但我们无法通过Gradle找到解决方法 - 我认为使用"站点部署".
搜索这一点非常复杂,因为"网站"是一个如此重载的术语,其他搜索不会产生任何结果.
我很困惑如何在Scala中解决这个问题.在Java中,我放弃了泛型或使用强制转换,但Scala比这更严格.这就是我所拥有的.
Factory[+F <: Factory[F]]和一些与此无关的具体实现.这是协变的.这个类有一个创建产品的方法 - 见下一点.Product[+F <: Factory[F]],表示工厂的产品.这些也是协变和只读的.任何特定工厂只生产一种产品(即没有多种不同的子类型--FooFactory生产FooProduct,BarFactory生产BarProduct等)Iterable[Factory[_]].这是麻烦的第一部分.Scala似乎在_这里理解为Any,无视F <: Factory[F]对类型本身的约束.Map[Factory[_],Product[_]]和尝试Map[Factory[_],Product[Factory[_]]].这是我遇到麻烦的另一部分.第一个_与第二个没有联系_,两者似乎都暗示为Any.我不能做的是创建该地图.它可能或不重要,但我通过使用另一种看起来像语法结构的方法来做(并且必须这样做).它来自一个特点:
gather[B](fun: A => B): Map[A,B]获取工厂集合的声明方法(在此处调用,未在特征本身中实现并通常键入).实际的工厂类型是通用的和未知的.MapF到P 的不可变量编译器的问题不在于'gather'方法,而是在调用它的代码中.我无法将其结果转换为Map[Factory[_],Product[_]]因为_ F <: Factory[F]在任何一个地方都不符合...我会非常乐意使用基类型_,但那就是Factory[Factory[Factory[Factory......(infinitely many times)]]]]]]....并且我不知道该怎么做.
请帮忙!
学习者
以下Scala类:
class Foo[+T <: Bar] extends FooBase ...
Run Code Online (Sandbox Code Playgroud)
有效地定义了一个以Foo [Bar]为根的类型层次结构 - 即任何有效的Foo [X]都可以赋值给Foo [Bar]值或变量:
val v1: Foo[Bar] = new Foo[SubBar1]();
val v2: Foo[Bar] = new Foo[SubBar2]();
Run Code Online (Sandbox Code Playgroud)
FooBase更进一步,也可能暗示不是Foo的对象 - 以下显示了问题:
class Trouble extends FooBase ...
val iOnlyWantFooHere: FooBase = new Trouble();
Run Code Online (Sandbox Code Playgroud)
...而且FooBase也不知道类型T,所以它的成员不能指定它,我必须在Foo中覆盖这些定义来专门化它们:
class FooBase {
def ohNoIDontKnowTheType: Bar;
}
class Foo[+T <: Bar] extends FooBase {
override def ohNoIDontKnowTheType: T = ...;
}
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以解决这个问题,但重点应该是明确的.
最后,我的实际问题是以下层次结构的根源:
class Foo[+T <: Foo[T]] extends FooBase ...
Run Code Online (Sandbox Code Playgroud)
再说一遍,不要告诉我FooBase,因为事实并非如此.是的,我可以在专门用于此目的之间插入另一个类,但这仍然不是如上所述的真实答案.
Scala不喜欢just Foo(没有type参数),并且它不是Foo[_]因为然后访问返回类型参数类型的值的方法实际上Any不是Foo …
我正在尝试学习如何使用“平台”来对齐多项目设置中项目之间的依赖版本。到目前为止,我已经看到:
我了解如何在项目中声明约束。我想我也了解如何为此目的使用 BOM。但是,我想为此使用一个“强制平台项目”,这里有很多事情我不明白:
总的来说,我没有找到足够的信息来对它的作用或工作方式充满信心。有人可以填写空白或指向一些显示比上述更多示例和详细信息的文档吗?目前我不明白我应该为那个平台项目(它的build.gradle)实际写什么和/或我将如何从我们拥有的当前项目中正确引用它。
谢谢!
更新 1:在https://discuss.gradle.org/t/can-someone-tell-me-what-i-am-doing-wrong-to- 上发布了一个最小的实验来测试我(缺乏)对此的理解align-dependency-versions-across-projects/35601 ...
gradle gradle-dependencies gradle-multi-project-build gradle-groovy-dsl
scala ×4
generics ×2
gradle ×2
arguments ×1
collections ×1
covariant ×1
currying ×1
root ×1
scala-2.10 ×1