超载很好.但是如果我们认为我们有两个对象ObjectA和objectB.两者都有"id"和"name"变量.我想写一个方法(在第三类),它返回给定对象的名称.编写重载函数使我重复代码.这是一个很好的做法吗?改为使用泛型函数会不会更好?
所以,我知道我可以编写一个重载函数,某事.像那样:
public String getInfo(ObjectA o){
if(o.getId()!=1) return o.name;
return "";
}
public String getInfo(ObjectB o){
if(o.getId()!=1) return o.name;
return "";
}
Run Code Online (Sandbox Code Playgroud)
它工作正常.但两个功能都是一样的!唯一的区别是事实,他们需要一个不同类型的论点.因为它们看起来一样,是不是违反了DRY规则?我尝试编写简单的泛型方法,但IDE将该.getId和that.name()标记为错误,并建议将其转换为((ObjectA)).getId()或((ObjectB)).getId() .我没有在"T that = clazz.cast(o);"我做错了什么?
public <T> String getInfo(Class<T> clazz, Object o) {
T that = clazz.cast(o);
if (that.getId()!=1) return that.name;
return "";
}
Run Code Online (Sandbox Code Playgroud)
一般来说,我想知道,如果我的想法是可能的.我该如何解决我的错误?而且,这是一个好主意吗?或者简单地编写重载函数是否更好?
我有一个关于应用多态的问题:让我们假设我有一个类Bird,并且我有许多扩展它的类(比如Pigeon,Falcon依此类推).接下来,我有一Cage堂课.在这堂课中,我想列出一个生活在笼子里的鸟类(只有一种鸟可以生活在每个笼子里).
因此,我不知道列表的扩展类型(A Pigeon?或者可能是Eagle?),我唯一知道的是它将是一个Bird.
如果 Pigeon extends Bird
使用多态性我可以将一只鸟声明为:
Bird tom = new Pigeon();而不是Pigeon tom = new Pigeon();
那么为什么我不能在构造函数中初始化类似的东西:[...]
private List<Bird> birdList;
public Cage() {
this.birdList = new ArrayList<Pigeon>();
/* Instead of birdList = new ArrayList<Bird>(); */
}
Run Code Online (Sandbox Code Playgroud)
如果你不能这样做,是否有可能以另一种方式实现我的目标?
我需要将列类型从tinyInt(用作bool)更改为Varchar,而不丢失数据。我在 stack-overflow 上找到了很多答案,但它们都是用 postgres 编写的,我不知道如何在 Mysql 中重写它。堆栈溢出问题的答案如下:
ALTER TABLE mytabe ALTER mycolumn TYPE VARCHAR(10) USING CASE WHEN mycolumn=0 THEN 'Something' ELSE 'TEST' END;
类似的逻辑在 Mysql 中会是什么样子?
java ×2
alter-column ×1
alter-table ×1
generics ×1
list ×1
mysql ×1
oop ×1
polymorphism ×1
sql ×1