码迷,mamicode.com
首页 > 其他好文 > 详细

trait

时间:2018-07-30 01:09:06      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:scala   user   javap   space   array   div   users   val   没有   

import classes.Point
import traits.Iterator
import traits.IntIterator
import traits.Dog
import traits.Cat
import scala.collection.mutable.ArrayBuffer
import traits.Pet

object Scala {

  def main( args : Array[ String ] ) : Unit =
    {
      var it = new IntIterator( 10 );
      println( it.next() )
      println( it.next() )
      println( it.next() )
      println( it.next() )
      println( it.next() )

      val dog = new Dog( "Harry" )
      val cat = new Cat( "Sally" )

      val animals = ArrayBuffer.empty[ Pet ]
      animals.append( dog )
      animals.append( cat )
//注意这个pet.name,这个name是在trait里面声明的,实现者的构造函数上有一个一样的变量,给实现者的赋值,想当于给trait的赋值,那么到底创建了几个变量? animals.
foreach( pet => println( pet.name ) ) // Prints Harry Sally } }
package traits

/**
 * use generic
 */
trait Iterator[ A ] {
  def hasNext : Boolean;
  def next() : A;

}
package traits

class IntIterator( to : Int ) extends Iterator[ Int ] {
  private var current = 0;
  def hasNext : Boolean = {
    current < to
  }

  def next() : Int = {
    if ( hasNext ) {
      val t = current
      current += 1
      t
    }
    else {
      0

    }
  }
}

上面是带范型的,下面是正常常规的

package traits

trait Pet {

  ///下面这个是语法糖,下面这个变量真正空间开在实现者身上,这里没有开辟空间或者声明变量
  var name : String;
}

class Cat( var name : String ) extends Pet;
class Dog( var name : String ) extends Pet;

 

 

//上面同name的trait解析

看编译后的文件

bogon:traits caicai$ ls
Cat.class    Dog.class    Pet.class
bogon:traits caicai$ pwd
/Users/caicai/workspace/scala/HelloWorld/src/traits/traits

那就是被编译成了三个class

Pet.class源码,Pet是一个接口,有俩个方法,由下可见trait里面并没有name这个字段.

bogon:traits caicai$ javap -c Pet.class 
Compiled from "Pet.scala"
public interface traits.Pet {
  public abstract java.lang.String name();

  public abstract void name_$eq(java.lang.String);
}

Dog.class源码

public class traits.Dog implements traits.Pet {
  public java.lang.String name();
    Code:
       0: aload_0                            
       1: getfield      #15                 // Field name:Ljava/lang/String;加载变量
       4: areturn

  public void name_$eq(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #15                 // Field name:Ljava/lang/String;
       5: return

  public traits.Dog(java.lang.String);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #15                 // Field name:Ljava/lang/String;
       5: aload_0
       6: invokespecial #24                 // Method java/lang/Object."<init>":()V
       9: return
}

那么可以知道.下面这个语法是一个糖衣.

      val dog = new Dog( "Harry" )
      val cat = new Cat( "Sally" )

      val animals = ArrayBuffer.empty[ Pet ]
      animals.append( dog )
      animals.append( cat )
      //注意这个pet.name,这个name是在trait里面声明的,实现者的构造函数上有一个一样的变量,只创建了一个变量
      animals.foreach( pet => println( pet.name ) ) // Prints Harry Sally
package traits;

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\00152A!\001\002\001\013\t\031Ai\\4\013\003\r\ta\001\036:bSR\0348\001A\n\004\001\031a\001CA\004\013\033\005A!\"A\005\002\013M\034\027\r\\1\n\005-A!AB!osJ+g\r\005\002\016\0355\t!!\003\002\020\005\t\031\001+\032;\t\021E\001!\0211A\005\002I\tAA\\1nKV\t1\003\005\002\02579\021Q#\007\t\003-!i\021a\006\006\0031\021\ta\001\020:p_Rt\024B\001\016\t\003\031\001&/\0323fM&\021A$\b\002\007‘R\024\030N\\4\013\005iA\001\002C\020\001\005\003\007I\021\001\021\002\0219\fW.Z0%KF$\"!\t\023\021\005\035\021\023BA\022\t\005\021)f.\033;\t\017\025r\022\021!a\001‘\005\031\001\020J\031\t\021\035\002!\021!Q!\nM\tQA\\1nK\002BQ!\013\001\005\002)\na\001P5oSRtDCA\026-!\ti\001\001C\003\022Q\001\0071\003")
public class Dog
  implements Pet
{
  private String name;
  
  public Dog(String name) {}
  
  public void name_$eq(String x$1)
  {
    this.name = x$1;
  }
  
  public String name()
  {
    return this.name;
  }
}

 

trait

标签:scala   user   javap   space   array   div   users   val   没有   

原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/9388404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!