// Code generated by gobind. DO NOT EDIT.

// Java class java.F is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java java
package java;

import go.Seq;

public interface F extends R {
    public String toString();
    
}

// Code generated by gobind. DO NOT EDIT.

// Java class java.L is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java java
package java;

import go.Seq;

public interface L extends R {
    public String toString();
    
}

// Code generated by gobind. DO NOT EDIT.

// Java class java.O is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java java
package java;

import go.Seq;

public interface O extends R {
    public String toString();
    
}

// Code generated by gobind. DO NOT EDIT.

// Java class java.R is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java java
package java;

import go.Seq;

public interface R {
    
}

// Code generated by gobind. DO NOT EDIT.

// Java class java.Java is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java java
package java;

import go.Seq;

public abstract class Java {
    static {
        Seq.touch(); // for loading the native library
        _init();
    }
    
    private Java() {} // uninstantiable
    
    // touch is called from other bound packages to initialize this package
    public static void touch() {}
    
    private static native void _init();
    
    private static final class proxyF implements Seq.Proxy, F {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyF(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native String toString();
    }
    private static final class proxyL implements Seq.Proxy, L {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyL(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native String toString();
    }
    private static final class proxyO implements Seq.Proxy, O {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyO(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
        public native String toString();
    }
    private static final class proxyR implements Seq.Proxy, R {
        private final int refnum;
        
        @Override public final int incRefnum() {
              Seq.incGoRef(refnum, this);
              return refnum;
        }
        
        proxyR(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
        
    }
    
    
}
