问题描述
我有以下两种方式
public class ObjectA {
int id ;
String name;
}
public class objectB {
Long id;
String name;
}
我希望能够创建一个将由这两个对象实现的接口'AnObject'。 这个界面怎么样?
public interface AnObject {
public <type?> getId() ;
public String getName();
}
ID的getter中的类型应该是什么?
1楼
首先,不要将其命名为Object
。
是Java所有其他类的隐式基类。
从技术上讲,你能说出你的界面Object
,只要你不把它放在包java.lang
,但是这将是很大的误导性。
要为ObjectA
和ObjectB
getId()
提供不同的返回类型,请使用泛型:
public interface MyObject<T> {
T getId();
String getName();
}
public class ObjectA implements MyObject<Integer> {
@Override
public Integer getId() {
return 0;
}
@Override
public String getName() {
return "A";
}
}
public class ObjectB implements MyObject<Long> {
@Override
public Long getId() {
return 0;
}
@Override
public String getName() {
return "B";
}
}
如果getId()
始终返回一个数字,您还可以将MyObject
定义为MyObject<T extends Number>
。
请注意,您不能使用本机类型int
和long
使用泛型;
你必须使用盒装类型Integer
和Long
。
2楼
假设你的id总是一个数字。
如果getter的用户getId()
没有(或者不应该)关心返回值的实际类型,你也可以直接使用Number
,而不使用泛型。
如果您想使用泛型,这取决于上下文。
在这种情况下不使用泛型的一个优点是您不必定义id的实际类型,这使得调用代码与MyObject
的实现更少耦合。
public interface AnObject {
public Number getId() ;
public String getName();
}
调用此代码的代码将不知道Id的实际类型。
但是,他们仍然可以确定它是一个数字,并且可以像调用代码所需的那样调用Number.doubleValue()
或Number.longValue()
类的东西。