Java 在这种情况下,如何正确使用泛型?
下面是我的变压器接口Java 在这种情况下,如何正确使用泛型?,java,generics,design-patterns,interface,Java,Generics,Design Patterns,Interface,下面是我的变压器接口 public interface Transformer<BusinessObject, O extends State> { public O transformToState(BusinessObject input); } 公共接口转换器 { 公共O transformToState(业务对象输入); } 这是我的一个变形金刚 public class GoldTransformer implements Transformer<Busi
public interface Transformer<BusinessObject, O extends State>
{
public O transformToState(BusinessObject input);
}
公共接口转换器
{
公共O transformToState(业务对象输入);
}
这是我的一个变形金刚
public class GoldTransformer implements Transformer<BusinessObject, Gold>
{
@Override
public Gold transformToState(BusinessObject input) {
GoldBO goldbo= (GoldBO) input; // redundant casting line
//do some transformation with BO to make it a state with some business logic
}
}
公共类GoldTransformer实现Transformer
{
@凌驾
public Gold transformToState(BusinessObject输入){
GoldBO GoldBO=(GoldBO)输入;//冗余铸造线
//对BO进行一些转换,使其成为具有一些业务逻辑的状态
}
}
这是我的另一台变压器
public class SilverTransformer implements Transformer<BusinessObject, Sliver>
{
@Override
public Gold transformToState(BusinessObject input) {
SilverBO goldbo= (SilverBO) input; // redundant casting line
// again do some transformation with BO to make it a state with some business logic
}
}
公共类SilverTransformer实现Transformer
{
@凌驾
public Gold transformToState(BusinessObject输入){
SilverBO goldbo=(SilverBO)输入;//冗余转换线
//再次对BO进行一些转换,使其成为具有一些业务逻辑的状态
}
}
SilverBO
和GoldBO
都实现了BusinessObject
,这是一个标记接口。和银色
和金色
扩展状态
。我真的觉得转换很烦人而且多余。这里有更好的方法使用泛型吗?还是使用更好的模式?我不想对状态
进行任何更改,即黄金和白银。您也可以在输入业务对象
上概括该界面:
public interface Transformer<I extends BusinessObject, O extends State> {
public O transformToState(I input);
}
public class GoldTransformer implements Transformer<GoldBO, Gold> {
@Override
public Gold transformToState(GoldBO input) {
// Code...
}
}
公共接口转换器{
公共O转换状态(I输入);
}
公共类GoldTransformer实现了Transformer{
@凌驾
公共Gold transformToState(GoldBO输入){
//代码。。。
}
}
同时将输入设置为通用:
public interface Transformer<I extends BusinessObject, O extends State> {
public O transformToState(I input);
}
看起来BusinessObject是一个类,但您也使用了与泛型类型参数相同的标识符!在这段代码中,BusinessObject不引用您的类,它是一个独特的标识符。如果它在不同的包中,您可以通过验证它不需要导入来验证这一点
interface Transformer<BusinessObject, O extends State>
{
public O transformToState(BusinessObject input);
}
接口转换器
{
公共O transformToState(业务对象输入);
}
这在语义上与以下内容相同:
interface Transformer<FlyingSpaghettiMonster, O extends State>
{
public O transformToState(FlyingSpaghettiMonster input);
}
接口转换器
{
public O transformToState(FlyingsPageThetTimenster输入);
}
任何像样的IDE都会为泛型类型参数添加不同的颜色,以帮助您区分它们。请参见下文,实际类型参数为白色,而泛型类型参数为深绿色:
虽然您应该更改泛型类型参数以避免混淆,但从技术上讲,要删除强制转换,只需更改transformer实现,如下所示:
public class GoldTransformer implements Transformer<GoldBO, Gold>
{ // ^ changed
@Override
public Gold transformToState(GoldBO input) {
// ^ changed
}
}
公共类GoldTransformer实现Transformer
{/^已更改
@凌驾
公共Gold transformToState(GoldBO输入){
//^更改
}
}
但是,您也可能(或可能)希望强制第一个类型参数是BusinessObject的子类,否则可以创建一个转换器。为此,请将界面更改为:
public interface Transformer<I extends BusinessObject, O extends State>
{
public O transformToState(I input);
}
公共接口转换器
{
公共O转换状态(I输入);
}
其中,I
现在是泛型类型参数,BusinessObject是一个真正的类型,它确实引用了您的类。Gold
和GoldBO
之间的关系是什么?GoldBO有一些额外的属性,而不是Gold的直接副本。根据业务逻辑,我决定哪些值应该属于Gold state。速度是真实的,+1。快速问题BusinessObject
是一个标记接口,我的SilverBO
实现了BusinessObject,而不是扩展了它。还能用吗?@Kid101:看修订版,在你添加评论之前4分钟我已经纠正了这个错误:)低带宽:)解释得很好+1.
interface Transformer<FlyingSpaghettiMonster, O extends State>
{
public O transformToState(FlyingSpaghettiMonster input);
}
public class GoldTransformer implements Transformer<GoldBO, Gold>
{ // ^ changed
@Override
public Gold transformToState(GoldBO input) {
// ^ changed
}
}
public interface Transformer<I extends BusinessObject, O extends State>
{
public O transformToState(I input);
}