35 lines
965 B
Plaintext
35 lines
965 B
Plaintext
![]() |
Needing to cast from an <code>interface</code> to a concrete type indicates that something is wrong with the abstractions in use, likely that something is missing from the <code>interface</code>. Instead of casting to a discrete type, the missing functionality should be added to the <code>interface</code>. Otherwise there is the risk of runtime exceptions.
|
||
|
|
||
|
== Noncompliant Code Example
|
||
|
|
||
|
----
|
||
|
public interface MyInterface {
|
||
|
void doStuff();
|
||
|
}
|
||
|
|
||
|
public class MyClass1 implements MyInterface {
|
||
|
int data;
|
||
|
public void DoStuff() {
|
||
|
// TODO...
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static class DowncastExampleProgram {
|
||
|
static void EntryPoint(MyInterface interfaceRef) {
|
||
|
MyClass1 class1 = (MyClass1)interfaceRef; // Noncompliant
|
||
|
int privateData = class1.data;
|
||
|
}
|
||
|
}
|
||
|
----
|
||
|
|
||
|
== Exceptions
|
||
|
|
||
|
Casting to <code>Object</code> doesn't raise an issue, because it can never fail.
|
||
|
----
|
||
|
static void EntryPoint(IMyInterface interfaceRef)
|
||
|
{
|
||
|
Object o = (Object)interfaceRef;
|
||
|
...
|
||
|
}
|
||
|
----
|