
#ImplementsRemote
public class ImplementsRemote implements java.rmi.Remote
{
}

#NoDefaultConstructor
public class NoDefaultConstructor implements java.io.Serializable
{
	public NoDefaultConstructor(String param) {
	}
}

#NoDefaultConstructorPrivateConstructors
public class NoDefaultConstructorPrivateConstructors implements java.io.Serializable
{
	private NoDefaultConstructorPrivateConstructors(String param) {
	}
}

#HasInadmisableInnerClass
public class HasInadmisableInnerClass implements java.io.Serializable 
{
	public class InnerClass {	
	}
}

#UsesUnsupportedAsField
public class UsesUnsupportedAsField implements java.io.Serializable
{
	public java.util.logging.LogRecord field;
}

#UsesUnsupportedAsProperty
public class UsesUnsupportedAsProperty implements java.io.Serializable
{
	public UsesUnsupportedAsProperty() {
	}	
	
	public NoDefaultConstructor[] getRecord() {
		return null;
	}
}

#UsesUnsupportedInMethod
public class UsesUnsupportedInMethod
{
	public java.util.logging.LogRecord [][] otherMethod() {
		return null;
	}	
	
	public java.util.logging.LogRecord [][] validate() {
		return null;
	}
}

#UsesUnsupportedInTransientMethod
import javax.xml.bind.annotation.XmlTransient;
public class UsesUnsupportedInTransientMethod
{
	@XmlTransient
	public java.util.logging.LogRecord getLogRecord() {
		return null;
	}
}

#WebFaultClass
import javax.xml.ws.WebFault;
@WebFault
public class WebFaultClass
{
	public WebFaultClass(String a) {
	}
}

#XmlTypeClass
import javax.xml.bind.annotation.XmlType;
@XmlType
public class XmlTypeClass
{
	public XmlTypeClass(String a) {
	}
}

#BaseNotImplemented
public abstract class BaseNotImplemented
{
}

#BaseImplementedNotCorrectly
public abstract class BaseImplementedNotCorrectly
{
}

#BaseImplementedNotCorrectlyExtendor
public abstract class BaseImplementedNotCorrectlyExtendor
{
}

#BaseImplementedNotCorrectlyImplementor
public class BaseImplementedNotCorrectlyImplementor extends BaseImplementedNotCorrectlyExtendor
{
}

#BaseImplemented
public abstract class BaseImplemented
{
}

#BaseImplementedImplementor
public class BaseImplementedImplementor extends BaseImplemented implements java.io.Serializable
{
}

#InterfaceNotImplemented
public interface InterfaceNotImplemented
{
}

#InterfaceImplemented
public interface InterfaceImplemented
{
}

#InterfaceImplementedImplementor
public class InterfaceImplementedImplementor implements InterfaceImplemented, java.io.Serializable
{
}

#EnumType
public enum EnumType {
	StringType,
	IntType,
	FloatType
}

#MultyInheritanceUseClass
public class MultyInheritanceUseClass extends BaseImplemented implements InterfaceImplemented, java.io.Serializable
{
}

#MultyInheritanceUseInterfaces
public class MultyInheritanceUseInterfaces implements InterfaceImplemented, InterfaceNotImplemented
{
}

#SupportedMultyInheritanceWithBaseClass
public class SupportedMultyInheritanceWithBaseClass extends BaseImplemented implements java.io.Serializable, java.lang.Cloneable, java.lang.Comparable {
	public int compareTo(Object arg0) {
		return 0;
	}
}

#SupportedMultyInheritanceWithInterface
public class SupportedMultyInheritanceWithInterface implements InterfaceImplemented, java.io.Serializable, Cloneable, Comparable {
	public int compareTo(Object arg0) {
		return 0;
	}
}

#ContainsList
public class ContainsList implements java.io.Serializable {
	public java.util.Map<String, java.util.List<String>> param;
}

#ContainsNotSupportedInList
public class ContainsNotSupportedInList implements java.io.Serializable {
	public java.util.List<java.util.logging.LogRecord> param;
}

#ContainsQuoteInList
public class ContainsQuoteInList implements java.io.Serializable {
	public java.util.List<?> param;
}

#ContainsExtendsInList
public class ContainsExtendsInList implements java.io.Serializable {
	public java.util.List<? extends String> param;
}

#ContainsSuperInList
public class ContainsSuperInList implements java.io.Serializable {
	public java.util.List<? super  String> param;
}

#CircularAsParamA
public class CircularAsParamA implements java.io.Serializable 
{
	public CircularAsParamB cB;
}

#CircularAsParamB
public class CircularAsParamB implements java.io.Serializable 
{
	public CircularAsParamA cA;
}

#CircularAsReturnValueA
public class CircularAsReturnValueA implements java.io.Serializable 
{
	public CircularAsReturnValueB returnCB() {
		return null;
	}
}

#CircularAsReturnValueB
public class CircularAsReturnValueB implements java.io.Serializable 
{
	public CircularAsReturnValueA returnCA() {
		return null;
	}
}

#CircularAsMixedParamReturnValueA
public class CircularAsMixedParamReturnValueA implements java.io.Serializable 
{
	public CircularAsMixedParamReturnValueB cB;
}

#CircularAsMixedParamReturnValueB
public class CircularAsMixedParamReturnValueB implements java.io.Serializable 
{
	public CircularAsMixedParamReturnValueA returnCA() {
		return null;
	}
	
	public void useCa(CircularAsMixedParamReturnValueA cA) {
	}	
}

#CustomException
public class CustomException extends java.lang.Exception implements InterfaceImplemented
{
	public CustomException() 
	{
		super();
	}
}

#MySet
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

public class MySet<T> implements Set<T> 
{
	public boolean add(T o) { return false; }
	public boolean addAll(Collection<? extends T> c) { return false; }
	public void clear() {}
	public boolean contains(Object o) {	return false; }
	public boolean containsAll(Collection<?> c) { return false; }
	public boolean isEmpty() { return false; }
	public Iterator<T> iterator() { return null; }
	public boolean remove(Object o) { return false;}
	public boolean removeAll(Collection<?> c) { return false; }
	public boolean retainAll(Collection<?> c) { return false; }
	public int size() {	return 0; }
	public Object[] toArray() {	return null; }
	public <T> T[] toArray(T[] a) {	return null;}
}

#MyMap
import java.util.Collection;
import java.util.Map;
import java.util.Set;

public class MyMap<K, V> implements Map<K, V>
{
	public void clear() {}
	public boolean containsKey(Object key) { return false; }
	public boolean containsValue(Object value) { return false; }
	public Set<java.util.Map.Entry<K, V>> entrySet() { return null;	}
	public V get(Object key) { return null; }
	public boolean isEmpty() { return false; }
	public Set<K> keySet() { return null; }
	public V put(K key, V value) { return null; }
	public void putAll(Map<? extends K, ? extends V> t) {}
	public V remove(Object key) { return null; }
	public int size() {	return 0; }
	public Collection<V> values() { return null; }
}