// Java class java.F is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

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

// Java class java.L is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

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

// Java class java.O is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

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

// Java class java.R is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package java;

import go.Seq;

public interface R {
    
}

// Java class java.Java is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
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); }
        
    }
    
    
}
