public class InterfaceDemo {
public static void Main(string[] args) {
Geek john = new Geek("John");
Geek paul = new Geek("Paul");
Hipster george = new Hipster("George");
Hipster ringo = new Hipster("Ringo");
var geekPersonalitiesIntroducer = new PersonalitiesIntroducer<Geek>();
var hipsterPersonalitiesIntroducer = new PersonalitiesIntroducer<Hipster>();
geekPersonalitiesIntroducer.Introduce(paul,john);
hipsterPersonalitiesIntroducer.Introduce(ringo,george);
// won't work, you can only introduce geeks to each other.
// error can be caught during compile-time:
// geekPersonalitiesIntroducer.Introduce(paul,george);
// won't work, you can only introduce hipsters to each other.
// error can be caught during compile-time:
// hipsterPersonalitiesIntroducer.Introduce(ringo,john);
}
}
interface IGreetable<T> {
string Hello(T another);
}
class Geek : IGreetable<Geek> {
string _name;
public Geek(string name) {
_name = name;
}
public string Hello(Geek another) {
return "Howdy, " + another + ". I'm " + _name;
}
override public string ToString() {
return _name;
}
}
class Hipster : IGreetable<Hipster> {
string _name;
public Hipster(string name) {
_name = name;
}
public string Hello(Hipster another) {
return "Hola, " + another + ". I'm " + _name;
}
override public string ToString() {
return _name;
}
}
class PersonalitiesIntroducer<T> where T : IGreetable<T> {
public void Introduce(T thisPerson, T toThatPerson) {
System.Console.WriteLine(thisPerson + " meet " + toThatPerson);
System.Console.WriteLine(thisPerson.Hello(toThatPerson));
System.Console.WriteLine();
}
}
Java version:
public class InterfaceDemo {
public static void main(String[] args) {
Geek john = new Geek("John");
Geek paul = new Geek("Paul");
Hipster george = new Hipster("George");
Hipster ringo = new Hipster("Ringo");
PersonalitiesIntroducer<Geek> geekPersonalitiesIntroducer = new PersonalitiesIntroducer<Geek>();
PersonalitiesIntroducer<Hipster> hipsterPersonalitiesIntroducer = new PersonalitiesIntroducer<Hipster>();
geekPersonalitiesIntroducer.introduce(paul,john);
hipsterPersonalitiesIntroducer.introduce(ringo,george);
// won't work, you can only introduce geeks to each other.
// error can be caught during compile-time:
// geekPersonalitiesIntroducer.introduce(paul,george);
// won't work, you can only introduce hipsters to each other.
// error can be caught during compile-time:
// hipsterPersonalitiesIntroducer.introduce(ringo,paul);
}
}
interface Greetable<T> {
String hello(T another);
}
class Geek implements Greetable<Geek> {
String _name;
public Geek(String name) {
_name = name;
}
public String hello(Geek another) {
return "Howdy, " + another + ". I'm " + _name;
}
@Override public String toString() {
return _name;
}
}
class Hipster implements Greetable<Hipster> {
String _name;
public Hipster(String name) {
_name = name;
}
public String hello(Hipster another) {
return "Hola, " + another + ". I'm " + _name;
}
@Override public String toString() {
return _name;
}
}
class PersonalitiesIntroducer<T extends Greetable<T>> {
public void introduce(T fromPerson, T toAnotherPerson) {
System.out.println(fromPerson + " meet " + toAnotherPerson);
System.out.println(fromPerson.hello(toAnotherPerson));
System.out.println();
}
}
Output:
Paul meet John Howdy, John. I'm Paul Ringo meet George Hola, George. I'm Ringo
The only part where Java and C# significantly differs(if at all) in these codes are in constraining the generic's type.
Contrast C#'s code:
class PersonalitiesIntroducer<T> where T : IGreetable<T> {
public void Introduce(T thisPerson, T toThatPerson) {
System.Console.WriteLine(thisPerson + " meet " + toThatPerson);
System.Console.WriteLine(thisPerson.Hello(toThatPerson));
System.Console.WriteLine();
}
}
To Java's code:
class PersonalitiesIntroducer<T extends Greetable<T>> {
public void introduce(T fromPerson, T toAnotherPerson) {
System.out.println(fromPerson + " meet " + toAnotherPerson);
System.out.println(fromPerson.hello(toAnotherPerson));
System.out.println();
}
}
C#'s syntax for constraining the generic type has more affinity with how the generics-using class will be used(instantiated). So you say in C# (and Java too):
PersonalitiesIntroducer<Geek> pi = new PersonalitiesIntroducer<Geek>(); // same syntax on both Java and C // In C#, you can shorten it to: var pi = new PersonalitiesIntroducer<Geek>(); // In Java 7, you can shorten it to: PersonalitiesIntroducer<Geek> pi = new PersonalitiesIntroducer<>();
Though in Java, the class declaration is like this:
class PersonalitiesIntroducer<T extends Greetable<T>>
You will not say in Java:
PersonalitiesIntroducer<Geek extends Greetable<Geek>> pi = new PersonalitiesIntroducer<Geek extends Greetable<Geek>>();
In Java, you instantiate generics the same way as C#.
Minor syntactic differences aside, C# and Java are very similar. You could even replace the Java code in movie Independence Day with C# and people won't even notice it
No comments:
Post a Comment