小编soc*_*soc的帖子

为什么IEnumerable <T>在C#4中变得协变?

在早期版本的C#IEnumerable中定义如下:

public interface IEnumerable<T> : IEnumerable
Run Code Online (Sandbox Code Playgroud)

从C#4开始,定义是:

public interface IEnumerable<out T> : IEnumerable
Run Code Online (Sandbox Code Playgroud)
  • 只是让LINQ表达式中令人讨厌的强制转换消失了吗?
  • 这不会引入与string[] <: object[]C#中的(破坏的数组方差)相同的问题吗?
  • 从兼容性的角度来看,如何完成协方差的增加?早期代码是否仍适用于更高版本的.NET,或者是否需要重新编译?反过来呢?
  • 以前使用此接口的代码在所有情况下都是严格不变的,或者某些用例现在可能会有不同的行为吗?

c# generics ienumerable language-design covariance

40
推荐指数
3
解决办法
5560
查看次数

为什么Scala中没有可变的TreeMap?

它是否缺乏时间,某些技术问题还是有理由不存在?

collections tree scala mutable map

38
推荐指数
3
解决办法
8623
查看次数

为什么Option没有折叠方法?

我想知道为什么scala.Option没有fold这样定义的方法:

fold(ifSome: A => B , ifNone: => B)
Run Code Online (Sandbox Code Playgroud)

相当于

map(ifSome).getOrElse(ifNone)
Run Code Online (Sandbox Code Playgroud)

有没有比使用map+ 更好的getOrElse

scala map fold scala-option

35
推荐指数
4
解决办法
8639
查看次数

如何使用Java 7的新File API检查路径是否指向现有文件?

旧的,或多或少已弃用的java.io.FileAPI有一个方法exists,如果File指向文件系统中的现有API ,则返回true ,但我找不到任何类似的方法java.nio.file.Path:

scala> import java.nio.file._
import java.nio.file._

scala> val path = Paths.get("/foo")
path: java.nio.file.Path = /foo

scala> path.
asInstanceOf     compareTo        endsWith         getFileName      getFileSystem    getName          getNameCount     
getParent        getRoot          isAbsolute       isInstanceOf     iterator         normalize        register         
relativize       resolve          resolveSibling   startsWith       subpath          toAbsolutePath   toFile           
toRealPath       toString         toUri  
Run Code Online (Sandbox Code Playgroud)

当然我可以将path背面转换为a File但我想有更好的方法可以做到这一点.

编辑:好的,感谢所有人指出Files.exists.有人知道为什么它变得更复杂(比有一个简单的exists方法Path)?

java filesystems file path java-7

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

日期转换

我有一个日期变量

var date: Date = new Date()
Run Code Online (Sandbox Code Playgroud)

然后我将这个日期转换为String:

var dateStr = date.toString()
Run Code Online (Sandbox Code Playgroud)

现在我需要将此String转换回日期.我试过了两个:

1:

   var stringToDate: Date = date2Str.asInstanceOf[Date]
Run Code Online (Sandbox Code Playgroud)

和2:

stringToDate: Date = new SimpleDateFormat("dd.MM.yyyy").parse(dateStr);
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下我都收到了错误:

java.lang.ClassCastException:
java.lang.String cannot be cast to java.util.Date
Run Code Online (Sandbox Code Playgroud)

scala date

33
推荐指数
2
解决办法
8万
查看次数

Scala中的闭包与Java中的闭包

前段时间,Oracle决定在Java 8中添加Closures是个好主意.我想知道与Scala相比,那里的设计问题是如何解决的,Scala从第一天就开始关闭.

援引未解决的问题,从javac.info:

  1. 方法句柄可以用于函数类型吗? 如何做到这一点并不明显.一个问题是Method Handles重新定义类型参数,但是以一种干扰函数子类型的方式.

  2. 我们可以摆脱"throws"类型参数的显式声明吗? 只要声明的边界是一个经过检查的异常类型,这个想法就是使用析取类型推断.这不是严格向后兼容的,但它不太可能破坏真正的现有代码.然而,由于语法模糊,我们可能无法摆脱类型参数中的"抛出".

  3. 在旧式循环索引变量上禁止@Shared

  4. 处理像Comparator这样定义多个方法的接口,除了其中一个接口之外的所有接口都将由继承自Object的方法实现."使用单一方法的接口"的定义应仅计算不会由Object中的方法实现的方法,并且如果实现其中一个方法将全部实现它们,则应将多个方法计为一个方法.主要是,这需要更精确地说明接口只有一个抽象方法的含义.

  5. 指定从函数类型到接口的映射:名称,参数等.我们应该完全指定从函数类型到系统生成的接口的映射.

  6. 类型推断.需要增加类型推断的规则以适应异常类型参数的推断.同样,闭包转换使用的子类型关系也应该反映出来.

  7. Elined异常类型参数有助于改进异常透明度. 也许使得省略的异常类型参数意味着绑定.这样可以通过添加新的通用异常参数来改进没有异常类型参数的现有通用接口,例如java.util.concurrent.Callable.

  8. 函数类型的类文字是如何形成的? 是#void().class?如果是这样,如果擦除对象类型,它是如何工作的?它是#?(?).class?

  9. 系统类加载器应动态生成函数类型接口. 与函数类型对应的接口应该由引导类加载器按需生成,因此它们可以在所有用户代码之间共享.对于原型,我们可能有javac生成这些接口,因此原型生成的代码可以在库存(JDK5-6)VM上运行.

  10. 每次对lambda表达式的求值必须产生一个新的对象吗? 希望不是.例如,如果lambda没有从封闭范围捕获变量,则可以静态分配.类似地,在其他情况下,如果lambda不捕获循环内声明的任何变量,则lambda可以移出内部循环.因此,如果规范不承诺关于lambda表达式的结果的引用标识,那么最好是这样的,因此这样的优化可以由编译器完成.

据我所知2.,6.和7.在Scala中不是问题,因为Scala不使用Checked Exceptions作为某种类似Java的"影子类型系统".

剩下的呢?

closures scala language-design java-8

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

Scala的.type和Java的.class文字

我想从语言设计的角度来看为什么Scala已经删除了Java的类文字(例如String.class)并将其替换为classOf[String],但是后来添加了一个"类型文字",其中包含Singletons Singleton.type而不是类似的东西typeOf[Singleton]

java types scala language-design class

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

代码运用lambda演算的每个边缘的独特可能性

我无法解释lambda立方体这个术语比维基百科更好:

[...]λ-cube是一个框架,用于探索Coquand构造计算中的细化轴,从简单类型的lambda演算开始,作为放置在原点的立方体的顶点,以及构造的微积分(更高阶)依赖型多态lambda演算作为其完全相反的顶点.立方体的每个轴代表一种新的抽象形式:

  • 术语取决于类型或多态性.系统F,又名二阶lambda演算,仅通过强加此属性获得.
  • 类型取决于类型或类型运算符.简单地键入lambda-calculus与类型运算符λω,只通过强加此属性获得.与系统F结合,产生系统Fω.
  • 类型取决于术语或依赖类型.仅施加此属性会产生λΠ,这是一种与LF密切相关的类型系统.

所有八个计算都包括最基本的抽象形式,术语取决于术语,普通函数与简单类型的lambda演算一样.立方体中最富有的微积分,包括所有三个抽象,是结构的微积分.所有八个结石都强烈正常化.

是否有可能在Java,Scala,Haskell,Agda,Coq等语言中找到代码示例,以便在缺少此优化的结石中无法实现每个细化?

language-agnostic theory types scala lambda-calculus

30
推荐指数
1
解决办法
891
查看次数

如何将多个PNG组合成一个大的PNG文件?

我有约.6000个PNG文件(256*256像素),并希望将它们组合成一个大PNG,以编程方式保存所有这些文件.

最好/最快的方法是什么?

(目的是在纸上打印,因此使用某些网络技术不是一种选择,只有一个单一图片文件将消除许多使用错误.)

我尝试了fahd的建议,NullPointerException但当我尝试创建一个BufferedImage宽24576像素,高15360像素的时候,我得到了一个.有任何想法吗?

java png scala image image-processing

29
推荐指数
3
解决办法
5万
查看次数

列表中的收益字符串[Char]

我有al:List [Char]我要连接的字符并在一个for循环中作为String返回.

我试过这个

val x: String = for(i <- list) yield(i)
Run Code Online (Sandbox Code Playgroud)

导致

 error: type mismatch;  
 found   : List[Char]  
 required: String
Run Code Online (Sandbox Code Playgroud)

那么如何更改产量的结果类型呢?

谢谢!

scala yield yield-return

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