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>