Bug 329266 - Deprecate and remove IDisposable
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/contexts/IEclipseContext.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/contexts/IEclipseContext.java
index c698c3a..7f0cbdb 100644
--- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/contexts/IEclipseContext.java
+++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/contexts/IEclipseContext.java
@@ -11,8 +11,6 @@
 
 package org.eclipse.e4.core.contexts;
 
-import org.eclipse.e4.core.di.IDisposable;
-
 /**
  * A context is used to isolate application code from its dependencies on an application framework
  * or container. This helps avoid building in dependencies on a specific framework that inhibit
@@ -37,7 +35,7 @@
  * @noimplement This interface is not intended to be implemented by clients.
  * @noextend This interface is not intended to be extended by clients.
  */
-public interface IEclipseContext extends IDisposable {
+public interface IEclipseContext {
 
 	/**
 	 * Returns whether this context or a parent has a value stored for the given name.
@@ -281,4 +279,9 @@
 	 */
 	public IEclipseContext getActiveLeaf();
 
+	/**
+	 * Disposes of this object. If this object is already disposed this method
+	 * will have no effect.
+	 */
+	public void dispose();
 }
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
index 65ea4ff..906cb78 100644
--- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
+++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/EclipseContext.java
@@ -22,7 +22,6 @@
 import org.eclipse.e4.core.contexts.IContextFunction;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.core.contexts.RunAndTrack;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.internal.contexts.osgi.ContextDebugHelper;
 
 /**
@@ -185,8 +184,8 @@
 			}
 		}
 
-		if (strategy instanceof IDisposable)
-			((IDisposable) strategy).dispose();
+		if (strategy != null)
+			strategy.dispose();
 		localValueComputations.clear();
 
 		// if this was the parent's active child, deactivate it
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ILookupStrategy.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ILookupStrategy.java
index 81c6905..3277b4f 100644
--- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ILookupStrategy.java
+++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/ILookupStrategy.java
@@ -43,4 +43,10 @@
 	 * value for the given name, and <code>false</code> otherwise.
 	 */
 	public boolean containsKey(String name, IEclipseContext context);
+
+	/**
+	 * Disposes of this object. If this object is already disposed this method
+	 * will have no effect.
+	 */
+	public void dispose();
 }
diff --git a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/osgi/OSGiContextStrategy.java b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/osgi/OSGiContextStrategy.java
index 48da0f1..560de75 100644
--- a/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/osgi/OSGiContextStrategy.java
+++ b/bundles/org.eclipse.e4.core.contexts/src/org/eclipse/e4/core/internal/contexts/osgi/OSGiContextStrategy.java
@@ -17,7 +17,6 @@
 import java.util.WeakHashMap;
 import org.eclipse.e4.core.contexts.IContextFunction;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.internal.contexts.EclipseContext;
 import org.eclipse.e4.core.internal.contexts.IContextDisposalListener;
 import org.eclipse.e4.core.internal.contexts.ILookupStrategy;
@@ -35,7 +34,7 @@
  * <p>
  * OSGi services are looked up by service class name.
  */
-public class OSGiContextStrategy implements IContextDisposalListener, ILookupStrategy, IDisposable, ServiceTrackerCustomizer {
+public class OSGiContextStrategy implements IContextDisposalListener, ILookupStrategy, ServiceTrackerCustomizer {
 	class ServiceData {
 		// the service name
 		String name;
diff --git a/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/di/IDisposable.java b/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/di/IDisposable.java
index 45be430..6632607 100644
--- a/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/di/IDisposable.java
+++ b/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/di/IDisposable.java
@@ -12,6 +12,9 @@
 
 /**
  * A generic interface to be used on objects that require explicit disposal.
+ * @deprecated This interface will be removed by the end of 4.1M4:
+ * - The IEclipseContext includes {@link #dispose()} method in its definition; and 
+ * - regular objects should use PreDestroy annotation instead.
  */
 public interface IDisposable {
 	/**
diff --git a/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java b/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
index efc4120..1554014 100644
--- a/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
+++ b/bundles/org.eclipse.e4.core.di/src/org/eclipse/e4/core/internal/di/InjectorImpl.java
@@ -36,7 +36,6 @@
 import javax.inject.Provider;
 import javax.inject.Singleton;
 import org.eclipse.e4.core.di.IBinding;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.di.IInjector;
 import org.eclipse.e4.core.di.InjectionException;
 import org.eclipse.e4.core.di.annotations.Optional;
@@ -322,8 +321,6 @@
 			}
 		}
 		for (int i = 0; i < count; i++) {
-			if (objects[i] instanceof IDisposable)
-				((IDisposable) objects[i]).dispose();
 			uninject(objects[i], objectSupplier);
 		}
 		forgetSupplier(objectSupplier);
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java
index 7f69865..abfc959 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/EclipseContextTest.java
@@ -16,7 +16,6 @@
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.core.contexts.RunAndTrack;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.internal.contexts.EclipseContext;
 
 public class EclipseContextTest extends TestCase {
@@ -91,7 +90,7 @@
 		assertNull(context.get("foo"));
 		parentContext.set("foo", "bar");
 		assertEquals("bar", context.get("foo"));
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertNull(context.get("foo"));
 		assertNull(((EclipseContext)parentContext).getChildren());
 	}
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/AnnotationsInjectionTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/AnnotationsInjectionTest.java
index ad2e1aa..6fe02d4 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/AnnotationsInjectionTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/AnnotationsInjectionTest.java
@@ -23,7 +23,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.di.annotations.Execute;
 import org.eclipse.e4.core.di.annotations.Optional;
 
@@ -199,7 +198,7 @@
 		assertEquals(fieldValue, object.injectedField);
 		assertNull(object.methodValue);
 
-		((IDisposable) context).dispose();
+		context.dispose();
 		if (error[0] != null)
 			throw error[0];
 	}
@@ -288,7 +287,7 @@
 		assertEquals(0, userObject.subPreDestroyCount);
 		assertEquals(0, userObject.overriddenPreDestroyCount);
 
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals(1, userObject.superPreDestroyCount);
 		assertEquals(1, userObject.subPreDestroyCount);
 		assertEquals(1, userObject.overriddenPreDestroyCount);
@@ -361,7 +360,7 @@
 		assertNotNull(object.value);
 		assertNotNull(object.directFieldInjection);
 		
-		((IDisposable)context).dispose();
+		context.dispose();
 		
 		assertEquals(1, object.preDestoryCalled);
 		assertNull(object.value);
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/Bug304585Test.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/Bug304585Test.java
index 7802d60..d849a89 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/Bug304585Test.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/Bug304585Test.java
@@ -18,7 +18,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.internal.contexts.EclipseContext;
 import org.eclipse.e4.core.internal.contexts.ILookupStrategy;
 
@@ -47,8 +46,8 @@
 
 		ContextInjectionFactory.make(InjectFieldTarget.class, child);
 
-		((IDisposable) child).dispose();
-		((IDisposable) parent).dispose();
+		child.dispose();
+		parent.dispose();
 		assertFalse("Strategy used after context disposed", strategy.lookupAfterDisposed);
 	}
 
@@ -59,12 +58,12 @@
 
 		ContextInjectionFactory.make(InjectMethodTarget.class, child);
 
-		((IDisposable) child).dispose();
-		((IDisposable) parent).dispose();
+		child.dispose();
+		parent.dispose();
 		assertFalse("Strategy used after context disposed", strategy.lookupAfterDisposed);
 	}
 
-	public static class Strategy implements IDisposable, ILookupStrategy {
+	public static class Strategy implements ILookupStrategy {
 		private boolean disposed = false;
 		boolean lookupAfterDisposed = false;
 		private PrintService printer = new StringPrintService();
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ComplexDisposalTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ComplexDisposalTest.java
index 82317ce..4ec22c0 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ComplexDisposalTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ComplexDisposalTest.java
@@ -20,7 +20,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 
 /**
  * See bug 296337: duplicate disposal of an object
@@ -60,9 +59,9 @@
 		Test test = (Test) context.get(Test.class.getName());
 
 		assertEquals(0, test.getCount());
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals("Context disposed, @PreDestroy should've been called", 1, test.getCount());
-		((IDisposable) parentContext).dispose();
+		parentContext.dispose();
 		assertEquals("Parent context disposed, @PreDestroy should not have been called again", 1, test.getCount());
 	}
 
@@ -74,9 +73,9 @@
 		Test test = (Test) ContextInjectionFactory.make(Test.class, context);
 
 		assertEquals(0, test.getCount());
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals("Context disposed, @PreDestroy should've been called", 1, test.getCount());
-		((IDisposable) parentContext).dispose();
+		parentContext.dispose();
 		assertEquals("Parent context disposed, @PreDestroy should not have been called again", 1, test.getCount());
 	}
 
@@ -89,9 +88,9 @@
 		ContextInjectionFactory.inject(test, context);
 
 		assertEquals(0, test.getCount());
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals("Context disposed, @PreDestroy should've been called", 1, test.getCount());
-		((IDisposable) parentContext).dispose();
+		parentContext.dispose();
 		assertEquals("Parent context disposed, @PreDestroy should not have been called again", 1, test.getCount());
 	}
 }
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ContextInjectionDisposeTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ContextInjectionDisposeTest.java
index 3088903..ef3af96 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ContextInjectionDisposeTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ContextInjectionDisposeTest.java
@@ -10,14 +10,16 @@
  *******************************************************************************/
 package org.eclipse.e4.core.internal.tests.contexts.inject;
 
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
+
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
+
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 
 /**
  * Tests for injection handling of context dispose, and handling disposal of injected objects.
@@ -37,7 +39,7 @@
 	}
 
 	public void testContextDisposedNoArg() {
-		class Injected implements IDisposable {
+		class Injected {
 
 			boolean disposeInvoked = false;
 
@@ -45,6 +47,8 @@
 			@Inject
 			private String Field;
 
+			@SuppressWarnings("unused")
+			@PreDestroy
 			public void dispose() {
 				disposeInvoked = true;
 			}
@@ -53,18 +57,20 @@
 		context.set(String.class.getName(), "hello");
 		Injected object = new Injected();
 		ContextInjectionFactory.inject(object, context);
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertTrue(object.disposeInvoked);
 	}
 
 	public void testDisposeContext() {
-		class Injected implements IDisposable {
+		class Injected {
 			boolean disposeInvoked = false;
 
 			@Inject
 			Object Field;
 			String methodValue;
 
+			@SuppressWarnings("unused")
+			@PreDestroy
 			public void dispose() {
 				disposeInvoked = true;
 			}
@@ -87,26 +93,22 @@
 		assertEquals(methodValue, object.methodValue);
 
 		// disposing context should clear values
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertNull(object.Field);
 		assertNull(object.methodValue);
 		assertTrue(object.disposeInvoked);
 	}
 
 	public void testReleaseObject() {
-		class Injected implements IDisposable {
+		class Injected {
 			boolean disposeInvoked = false;
-			boolean destroyInvoked = false;
 
 			@Inject
 			Integer Field;
 			Object methodValue;
 
 			@SuppressWarnings("unused")
-			public void destroy() {
-				destroyInvoked = true;
-			}
-
+			@PreDestroy
 			public void dispose() {
 				disposeInvoked = true;
 			}
@@ -134,8 +136,7 @@
 
 		assertNull(object.Field);
 		assertNull(object.methodValue);
-		assertFalse(object.disposeInvoked);
-		assertFalse(object.destroyInvoked);
+		assertTrue(object.disposeInvoked);
 	}
 
 }
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ExtraDependenciesTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ExtraDependenciesTest.java
index 96b8a80..2ca0087 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ExtraDependenciesTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ExtraDependenciesTest.java
@@ -21,7 +21,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 
 public class ExtraDependenciesTest extends TestCase {
 
@@ -79,7 +78,7 @@
 		assertEquals("other", object.other);
 		
 		// dispose the other context; should not cause disposal of the test object
-		((IDisposable)otherContext).dispose();
+		otherContext.dispose();
 		assertEquals("other", object.other);
 		assertFalse(object.disposed);
 		
@@ -95,7 +94,7 @@
 		assertNull(object.other);
 		
 		// check that disposal of the injected context causes disposal of the injected object
-		((IDisposable)context).dispose();
+		context.dispose();
 		assertTrue(object.disposed);
 		assertNull(object.string);
 		assertNull(object.integer);
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/InjectionOrderTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/InjectionOrderTest.java
index 555bd97..f1b8cd6 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/InjectionOrderTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/InjectionOrderTest.java
@@ -19,7 +19,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 
 public class InjectionOrderTest extends TestCase {
 
@@ -73,7 +72,7 @@
 		appContext.set("inject", "b");
 
 		// now we dispose the context 
-		((IDisposable) appContext).dispose();
+		appContext.dispose();
 		
 		// check that the second 'set' invocation did not alter the order of notifications
 		assertTrue("@PreDestroy was incorrectly called after the method was uninjected", injectTargetMethod.nonNull);
@@ -97,7 +96,7 @@
 		appContext.set("inject", "b");
 
 		// now we dispose the context 
-		((IDisposable) appContext).dispose();
+		appContext.dispose();
 		
 		assertTrue("@PreDestroy was incorrectly called after the field was uninjected", injectTargetField.nonNull);
 	}
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ParentContextDisposalTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ParentContextDisposalTest.java
index 55a28e6..bf69e58 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ParentContextDisposalTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ParentContextDisposalTest.java
@@ -20,7 +20,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 
 public class ParentContextDisposalTest extends TestCase {
 	static class Target {
@@ -50,7 +49,7 @@
 		Target target = (Target) ContextInjectionFactory.make(Target.class, child);
 		assertEquals(1, target.pc);
 
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals(1, target.pd);
 	}
 }
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ServiceContextTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ServiceContextTest.java
index 1647455..02ba0de 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ServiceContextTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/contexts/inject/ServiceContextTest.java
@@ -22,7 +22,6 @@
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.core.contexts.RunAndTrack;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.internal.tests.CoreTestsActivator;
 import org.eclipse.osgi.service.debug.DebugOptions;
 import org.osgi.framework.BundleContext;
@@ -90,7 +89,7 @@
 
 	protected void tearDown() throws Exception {
 		super.tearDown();
-		((IDisposable) context).dispose();
+		context.dispose();
 		for (ServiceRegistration reg : registrations) {
 			try {
 				reg.unregister();
@@ -170,7 +169,7 @@
 			assertEquals("1.0", stringPrint1, service);
 			assertEquals("1.1", 1, ref.getUsingBundles().length);
 			service = null;
-			((IDisposable) context).dispose();
+			context.dispose();
 			assertNull("2.0", ref.getUsingBundles());
 		} finally {
 			reg1.unregister();
@@ -189,7 +188,7 @@
 		context.runAndTrack(new RunAndTrack() {
 			public boolean changed(IEclipseContext context) {
 				if (context.get(PrintService.SERVICE_NAME) == null) {
-						((IDisposable) child).dispose();
+						child.dispose();
 					done[0] = true;
 				}
 				return true;
@@ -235,7 +234,7 @@
 		child = context.createChild("child-2");
 		service = (PrintService) child.get(PrintService.SERVICE_NAME);
 		service = null;
-		((IDisposable) child).dispose();
+		child.dispose();
 		child = null;
 
 		//now there should be no service references, even though child1 was never disposed
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/DisposeClassLinkTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/DisposeClassLinkTest.java
index 285a3e7..2efc39d 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/DisposeClassLinkTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/DisposeClassLinkTest.java
@@ -19,7 +19,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 
 /**
  * Checks that injected objects that do not have normal links
@@ -68,7 +67,7 @@
 		Test test = (Test) ContextInjectionFactory.make(Test.class, context);
 
 		assertEquals(0, test.getCount());
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals(1, test.getCount());
 	}
 
@@ -78,9 +77,9 @@
 		Test test = (Test) ContextInjectionFactory.make(Test.class, context);
 
 		assertEquals(0, test.getCount());
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals(1, test.getCount());
-		((IDisposable) parentContext).dispose();
+		parentContext.dispose();
 		assertEquals(1, test.getCount());
 	}
 
@@ -91,7 +90,7 @@
 		ContextInjectionFactory.inject(test, context);
 
 		assertEquals(0, test.getCount());
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals(1, test.getCount());
 	}
 
@@ -102,9 +101,9 @@
 		ContextInjectionFactory.inject(test, context);
 
 		assertEquals(0, test.getCount());
-		((IDisposable) context).dispose();
+		context.dispose();
 		assertEquals(1, test.getCount());
-		((IDisposable) parentContext).dispose();
+		parentContext.dispose();
 		assertEquals(1, test.getCount());
 	}
 
@@ -117,7 +116,7 @@
 	    assertEquals("@PostConstruct should have been called once", 1, obj.postConstruct);
 	    assertEquals("@PreDestroy should not have been called", 0, obj.preDestroy);
 
-	    ((IDisposable) context).dispose();
+	    context.dispose();
 
 	    assertNull("The object should have been uninjected", obj.context);
 	    assertEquals("@PostConstruct should only have been called once", 1, obj.postConstruct);
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectionOrderTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectionOrderTest.java
index 22457d2..8c321d1 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectionOrderTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/InjectionOrderTest.java
@@ -19,7 +19,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.di.InjectionException;
 
 public class InjectionOrderTest extends TestCase {
@@ -60,7 +59,7 @@
 			exception = true;
 		}
 		assertTrue(exception);
-		((IDisposable) appContext).dispose();
+		appContext.dispose();
 		assertEquals(0, InjectUnsatisfied.count);
 	}
 }
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/manual/InjectionErrorReportingTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/manual/InjectionErrorReportingTest.java
index f4af7a9..dfbf57f 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/manual/InjectionErrorReportingTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/manual/InjectionErrorReportingTest.java
@@ -20,7 +20,6 @@
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.EclipseContextFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.di.IDisposable;
 import org.eclipse.e4.core.di.InjectionException;
 
 /**
@@ -227,7 +226,7 @@
 		ContextInjectionFactory.make(InjectedPreDestroy.class, context);
 		boolean exception = false;
 		try {
-			((IDisposable)context).dispose();
+			context.dispose();
 		} catch (InjectionException e) {
 			basicLog(e);
 			exception = true;