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

import go.Seq;

public interface F {
    
}

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

import go.Seq;

public interface O extends F, R {
    // skipped method O.Super with unsupported parameter or return types
    
    
}

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

import go.Seq;

public interface R {
    
}

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

import go.Seq;

public interface S extends F, R {
    // skipped method S.Super with unsupported parameter or return types
    
    
}

// Java class go.java.Java is a proxy for talking to a Go program.
//   gobind -lang=java java
//
// File is generated by gobind. Do not edit.
package go.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 Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyF(Seq.Ref ref) { this.ref = ref; }
        
    }
    private static final class proxyO implements Seq.Proxy, O {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyO(Seq.Ref ref) { this.ref = ref; }
        
        // skipped method O.Super with unsupported parameter or return types
        
    }
    private static final class proxyR implements Seq.Proxy, R {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyR(Seq.Ref ref) { this.ref = ref; }
        
    }
    private static final class proxyS implements Seq.Proxy, S {
        private final Seq.Ref ref;
        
        @Override public final int incRefnum() {
              int refnum = ref.refnum;
              Seq.incGoRef(refnum);
              return refnum;
        }
        
        proxyS(Seq.Ref ref) { this.ref = ref; }
        
        // skipped method S.Super with unsupported parameter or return types
        
    }
    
    
}
