// 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 extends Seq.Proxy implements F {
    	proxyF(Seq.Ref ref) { super(ref); }
    
    }
    private static final class proxyO extends Seq.Proxy implements O {
    	proxyO(Seq.Ref ref) { super(ref); }
    
        // skipped method O.Super with unsupported parameter or return types
        
    }
    private static final class proxyR extends Seq.Proxy implements R {
    	proxyR(Seq.Ref ref) { super(ref); }
    
    }
    private static final class proxyS extends Seq.Proxy implements S {
    	proxyS(Seq.Ref ref) { super(ref); }
    
        // skipped method S.Super with unsupported parameter or return types
        
    }
    
    
}
