我有以下两种方式
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类型应该是什么?
答案 0 :(得分:18)
首先,不要将其命名为Object
。 Object
是Java的所有其他类的隐式基类。从技术上讲,只要您不将其放在包Object
中,就可以将界面命名为java.lang
,但这会产生很大的误导性。
要为getId()
和ObjectA
中的ObjectB
提供不同的报表类型,请使用泛型:
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
。
答案 1 :(得分:0)
假设您的ID始终是一个数字。
如果您的getter getId()
的用户没有(或不应该)关心返回值的实际类型,您也可以直接使用Number
,而不使用泛型。如果您想使用泛型,这取决于上下文。在这种情况下,不使用泛型的一个优点是您不必定义id的实际类型,这使得调用代码与MyObject
的实现更少耦合。
public interface AnObject {
public Number getId() ;
public String getName();
}
调用它的代码不会知道Id的实际类型。但是,他们仍然可以确定它是一个数字,可以像调用代码一样调用Number.doubleValue()
或Number.longValue()
之类的内容。