我有以下通用介面/類
public interface AnInterface <T>{
T convertToY();
String getName();
String getLastName();
}
public class Foo implements AnInterface<Foo>{
// some methods specific to Foo
}
public class Bar implements AnInterface<Bar>{
// some methods specific to Bar
}
我創建了一個通用方法如下(我不認為它會起作用,但確實如此)
public static <T> List<Person> getPersons(AnInterface<T> in) {
System.out.println(map.get(in));
List<Person> list = new ArrayList<>();
if (in instanceof Foo) {
Person p = new Person(in.getName(), in.getLastName());
p.setId(((Foo) in).getId());
list.add(p);
}
else if(in instanceof Bar) {
Person p = new Person(in.getName(), in.getLastName());
p.setCC(((Bar) in).getCC());
list.add(p);
}
return list;
}
問題是我沒有創建類,所以我不確定這樣做
public class Foo implements AnInterface<Foo>是否正常。
所以我感興趣的是泛型方法和使用instanceof是否有任何問題,以及是否有任何可以創建的問題。例如,如果我沒記錯的話,我們不能instanceof在集合上使用,所以我想知道我是否可以很容易地用這種方法引入一些其他錯誤。
注意:。我無法修改AnInterface或Foo或Bar
uj5u.com熱心網友回復:
只需添加一個applyToPerson方法到AnInterface. 這確保了任何實作都AnInterface考慮了它需要在getPersons. 在您的實作中,新的子類AnInterface將導致getPersons靜默回傳一個空串列。:
import java.util.ArrayList;
import java.util.List;
interface AnInterface <T>{
Person applyToPerson(Person p);
String getName();
String getLastName();
}
class Person {
public Person(String name, String lastName) {
}
void setId(int id) {}
void setCC(int cc) {}
}
class Foo implements AnInterface<Foo>{
int getId() { return 0; }
@Override
public Person applyToPerson(Person p) {
p.setId(getId());
return p;
}
@Override
public String getName() {
return null;
}
@Override
public String getLastName() {
return null;
}
}
class Bar implements AnInterface<Bar>{
int getCC() {
return 0;
}
@Override
public Person applyToPerson(Person p) {
p.setCC(getCC());
return p;
}
@Override
public String getName() {
return null;
}
@Override
public String getLastName() {
return null;
}
}
public class Application {
public static List<Person> getPersons(AnInterface in) {
List<Person> list = new ArrayList<>();
list.add(in.applyToPerson(new Person(in.getName(), in.getLastName())));
return list;
}
}
uj5u.com熱心網友回復:
public class Foo implements AnInterface<Foo>{...}
也許代碼有效,但這是什么意思?目前還不清楚,因為 foo 類還沒有實作。
public class Foo implements AnInterface<T>{...}
這不是你的情況,而是一個更通用的版本,所以仍然很有趣。擴展泛型類的非泛型類。似乎它被認為是一種反模式。 看到這個執行緒
uj5u.com熱心網友回復:
如果您不允許修改這些類和介面,您可以做一些事情。
由于您已經采取了這樣的路線,即實作Foo和Bar分歧,并且您無法在它們之間進行互操作,我建議將此方法拆分為兩個獨立的可讀性強的多載方法:
public static List<Person> getPersons(Bar bar) {
List<Person> list = new ArrayList<>();
Person p = new Person(bar.getName(), bar.getLastName());
p.setCC(bar.getCC());
list.add(p);
return list; // use List.of(p) if you don't need this list be modifiable
}
public static List<Person> getPersons(Foo foo) {
List<Person> list = new ArrayList<>();
Person p = new Person(foo.getName(), foo.getLastName());
p.setId(foo.getId());
list.add(p);
return list; // use List.of(p) if you don't need this list be modifiable
}
如果您想保留一個期望超型別實體的單個方法,我可以建議這些小的增強功能。
instanceof您可以使用Java 16 中引入的 instanceof 的模式匹配,而不是在 -check 之后執行強制轉換。
if (in instanceof Foo foo) {
Person p = new Person(foo.getName(), foo.getLastName());
p.setId(foo.getId());
list.add(p);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519881.html
