我正在研究Scala 2.8集合类的源代码.我对层次结构有疑问scala.collection.Traversable.请查看以下声明:
package scala.collection
trait Traversable[+A]
extends TraversableLike[A, Traversable[A]]
with GenericTraversableTemplate[A, Traversable]
trait TraversableLike[+A, +Repr]
extends HasNewBuilder[A, Repr]
with TraversableOnce[A]
package scala.collection.generic
trait HasNewBuilder[+A, +Repr]
trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]]
extends HasNewBuilder[A, CC[A] @uncheckedVariance]
Run Code Online (Sandbox Code Playgroud)
问题:为什么要使用类型参数进行Traversable扩展- 为什么不呢?我试着尝试一个具有相同结构的小程序,并在我尝试将其更改为时收到一条奇怪的错误消息:GenericTraversableTemplate[A, Traversable][A, Traversable[A]]Traversable[A]
error: Traversable[A] takes no type parameters, expected: one
Run Code Online (Sandbox Code Playgroud)
我猜这个@uncheckedVariance注释的使用GenericTraversableTemplate也与此有关吗?(这似乎是一种可能不安全的黑客,迫使事情发挥作用......).
编辑 - 在这个问题中找到关于注释的一些有用的答案(因为GenericTraversableTemplate它用于具有不同方差的可变和不可变集合).
问题:当您查看层次结构时,您会看到Traversable继承HasNewBuilder两次(一次通过TraversableLike和一次通过GenericTraversableTemplate),但类型参数略有不同.这是如何工作的?为什么不同的类型参数不会导致错误?
我正在尝试编写一个泛型interpolate方法,该方法适用于任何具有两种方法的类型,a *和a +,如下所示:
trait Container {
type V = {
def *(t: Double): V
def +(v: V): V
}
def interpolate(t: Double, a: V, b: V): V = a * (1.0 - t) + b * t
}
Run Code Online (Sandbox Code Playgroud)
这不起作用(在Scala 2.8.0.RC7上),我收到以下错误消息:
<console>:8: error: recursive method + needs result type
def +(v: V): V
^
<console>:7: error: recursive method * needs result type
def *(t: Double): V
^
Run Code Online (Sandbox Code Playgroud)
如何正确指定结构类型?(或者有更好的方法吗?)
我正在玩Spring ConversionService,添加一个简单的转换器将ZonedDateTime(Java 8)转换为String:
@Bean
public ConversionServiceFactoryBean conversionServiceFactoryBean() {
ConversionServiceFactoryBean conversionServiceFactoryBean =
new ConversionServiceFactoryBean();
Converter<ZonedDateTime, String> dateTimeConverter =
new Converter<ZonedDateTime, String>() {
@Override
public String convert(ZonedDateTime source) {
return source.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
};
conversionServiceFactoryBean.setConverters(
new HashSet<>(Arrays.asList(dateTimeConverter)));
return conversionServiceFactoryBean;
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但我的IDE(IntelliJ)建议用lambda表达式替换匿名内部类:
Converter<ZonedDateTime, String> dateTimeConverter =
source -> source.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
Run Code Online (Sandbox Code Playgroud)
如果我这样做,那么它不再起作用,我得到一个关于Spring无法确定泛型类型的错误:
Caused by: java.lang.IllegalArgumentException: Unable to the determine sourceType <S> and targetType <T> which your Converter<S, T> converts between; declare these generic types.
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.core.convert.support.GenericConversionService.addConverter(GenericConversionService.java:100)
at org.springframework.core.convert.support.ConversionServiceFactory.registerConverters(ConversionServiceFactory.java:50)
at …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的函数:
class SomeClass {
// ...
};
void some_function(const SomeClass& arg = SomeClass());
Run Code Online (Sandbox Code Playgroud)
该函数some_function通过引用访问其参数并具有默认值.这样做是否安全,或者在没有参数的情况下调用函数时引用是否无效?
我正在将SIMD代码转换为等效的c代码.我被困在SSE指令之一
__m128i _mm_packus_epi16 (__m128i a, __m128i b)
Run Code Online (Sandbox Code Playgroud)
它返回
r0 := UnsignedSaturate(a0)
r1 := UnsignedSaturate(a1)
...
r7 := UnsignedSaturate(a7)
r8 := UnsignedSaturate(b0)
r9 := UnsignedSaturate(b1)
...
r15 := UnsignedSaturate(b7)
Run Code Online (Sandbox Code Playgroud)
什么UnsignedSaturate意思?
您可以使用 Java 中的绑定来限制类型参数。例如:
interface Foo<T extends Bar> {
// ...
}
Run Code Online (Sandbox Code Playgroud)
您可以使用多种类型进行绑定,包括接口、类、参数化类型和类型参数。换句话说:Bar可以是接口、类等(不能是基元或数组类型)。
您还可以使用final类enum和record类型作为边界。所以当Bar是一个final类enum或时,上面的方法仍然有效record。
但是enumandrecord类型是隐式的final- 不可能创建enumor的子类型record。这意味着当您使用enumorrecord作为类型参数绑定时,填充类型参数的唯一可能性是使用该特定enum或record类型本身作为类型参数。课程也是如此final。
Foo<T>如果 ifT不能是它自身以外的任何东西,那是没有意义的Bar。在这种情况下,您也可以完全省略类型参数Foo并直接使用Bar。
在某些情况下,您可以使用final类enum或record类型作为类型参数绑定吗?
什么是冗余的Java import语句?
它们是否影响编译的运行时(性能/大小)?还是像intellisense这样的东西?
提出不同的问题:删除它们有多重要?
以下代码段可以很好地将数字拆分成数字,但它太长了:
val digits = (num toString).toList map(_.toString) map(_.toInt)
Run Code Online (Sandbox Code Playgroud)
我使用它们toString来获取应用时的实际值,toInt而不是Int表示Char返回的值toList.
我是Scala的新手,我不习惯scala的表达风格.有没有更短的方式来做到这一点.
所以说我有一个字节数组,并且我有一个函数来检查字节数组的第n个最低有效位索引是1还是0.如果该位是1则返回true,如果该位则返回false字节数组的最低有效位定义为字节数组第0个索引中的最后一个有效位,字节数组的最高有效位定义为(字节数组中的最高有效位). length - 1)字节数组的索引.
例如,
byte[] myArray = new byte[2];
byte[0] = 0b01111111;
byte[1] = 0b00001010;
Run Code Online (Sandbox Code Playgroud)
呼叫:
myFunction(0) = true;
myFunction(1) = true;
myFunction(7) = false;
myFunction(8) = false;
myFunction(9) = true;
myFunction(10) = false;
myFunction(11) = true;
Run Code Online (Sandbox Code Playgroud)
做这个的最好方式是什么?
谢谢!
我用以下代码得到一个奇怪的错误.
我有一个Example带有伴侣对象的类,我在其中定义了一个字符串SIGN.在类Example我有一个方法,我创建一个正则表达式,我使用字符串插值,以便我可以SIGN用来构建我的正则表达式.
这编译,但我在运行时遇到一个奇怪的错误.这是Scala的错误吗?我正在使用Scala 2.10.3(在Windows 7上).
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Example {
import Example._
def regex = s"""$SIGN?\d+""".r
}
object Example {
private val SIGN = """(\+|-)"""
}
// Exiting paste mode, now interpreting.
defined class Example
defined module Example
scala> val e = new Example
e: Example = Example@77c957d9
scala> e.regex
scala.StringContext$InvalidEscapeException: invalid escape character at index 1 in "?\d+"
at scala.StringContext$.treatEscapes(StringContext.scala:229)
at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90)
at scala.StringContext$$anonfun$s$1.apply(StringContext.scala:90) …Run Code Online (Sandbox Code Playgroud)