Scala 内部函数对实例化对象有什么影响?
下面的代码在构造时失败Scala 内部函数对实例化对象有什么影响?,scala,guava,typetoken,Scala,Guava,Typetoken,下面的代码在构造时失败 new TypeParameter[K]() {} 只有mapToken的位置不同 package net.ailive; import org.junit.Test; import com.google.common.reflect.TypeParameter; import com.google.common.reflect.TypeToken; import java.math.BigInteger; import java.util.Map; impor
new TypeParameter[K]() {}
只有mapToken的位置不同
package net.ailive;
import org.junit.Test;
import com.google.common.reflect.TypeParameter;
import com.google.common.reflect.TypeToken;
import java.math.BigInteger;
import java.util.Map;
import java.util.Queue;
class SampleJUnitScala {
// Succeeds if defined here ***
// def mapToken[K, V](keyToken: TypeToken[K], valueToken: TypeToken[V]): TypeToken[Map[K, V]] = {
// return new TypeToken[Map[K, V]]() {}
// .where(new TypeParameter[K]() {}, keyToken)
// .where(new TypeParameter[V]() {}, valueToken);
// }
@Test
def myTest() = {
// Fails if defined here ***
def mapToken[K, V](keyToken: TypeToken[K], valueToken: TypeToken[V]): TypeToken[Map[K, V]] = {
return new TypeToken[Map[K, V]]() {}
.where(new TypeParameter[K]() {}, keyToken)
.where(new TypeParameter[V]() {}, valueToken);
}
val mapTok = mapToken(
TypeToken.of(classOf[String]),
TypeToken.of(classOf[BigInteger]));
val complexToken = mapToken(
TypeToken.of(classOf[Integer]),
new TypeToken[Queue[String]]() {});
}
}
(TypeParameter.capture()返回null)
如果我更改mapToken函数的位置。它起作用了。为什么?
在Scala中看到:2.10
TypeToken来自:(?)
番石榴
番石榴
字节码中有一些相当小的差异。在mapToken中添加了private final
,将mapToken重命名为mapToken$1
,并更改了方法的顺序。还有一个测试通过了,还有一个没有通过。我能看到的字节码(除了类名)的唯一区别是泛型参数:
当查看内部类(例如,samplejunitscaloouterfunction$$anon$1
)时,除了名称之外,它们看起来是相同的
JVM不使用泛型参数,它们在编译时使用,Guava也使用。TypeParameter
的构造函数尝试读取其类型参数T
但是,我不确定为什么
mapToken
在外部函数中使用时会起作用。类型参数不会在运行时传递,Guava应该无法从new TypeParameter[K]()
读取实际类型,因为SampleJunitScalouterFunction$$anon$3
类是泛型的。Hmm,非常奇怪。如果没有自动传递给mapToken的外部变量,那么它们都应该编译成相同的字节码。您能发布最不可编译的代码段吗?我可以区分字节码。@v6ak--已经添加了完整的示例。您是否在没有不必要的返回语句的情况下尝试过它?没有。。。因为它在此之前在TypeParameter构造函数中死亡。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>