gpt4 book ai didi

Java:通用返回类型,使用类参数与括号调用之间的区别?

转载 作者:行者123 更新时间:2023-11-30 10:36:25 26 4
gpt4 key购买 nike

我需要与一个复杂的遗留类进行交互,该类的几乎所有方法参数和返回类型都是 Object

在我的代码中,我知道我只会处理一小部分功能,而且我知道所有参数的确切类型和将使用的返回类型。为了使我的代码更友好,我想隐藏任何可能需要进行的转换,并且只使用具体类型。我注意到有两种功能相同的方法可以包装遗留类方法:

public class LegacyClass {
public Object legacyMethod(Object o) {
...
}
}
LegacyClass foo = new LegacyClass();

private <T> T legacyMethodWrapper1(String s) {
return (T) foo.legacyMethod(s); //Warning: unchecked cast
}

private <T> T legacyMethodWrapper2(String s, Class<T> c) {
return (T) foo.legacyMethod(s); //Warning: unchecked cast
}

public String getLegacyDataString1(String s) {
return this.<String>legacyMethodWrapper1(s);
}

public String getLegacyDataString2(String s) {
return this.legacyMethodWrapper2(s, String.class);
}

虽然此处显示的简单代码似乎没有任何功能差异,但我很好奇我是否遗漏了 legacyMethodWrapper1legacyMethodWrapper2 之间的其他一些细微差异,除了 legacyMethodWrapper2 可以访问额外的 Class 对象之外,还有可能做一些比强制转换更复杂的操作?

编辑:明确地说,包装这些遗留方法的目标之一是 1) 为调用者 提供类型安全和 2) 防止调用者看到无意义的警告。因为我对设计不佳的遗留类的了解比编译器所能知道的还要多,所以我可以提供 100% 类型安全的接口(interface)并隐藏任何无意义的编译器警告。

最佳答案

您不需要为每种类型创建单独的方法,除非您确实需要。

以下是我的看法-

class LegacyWrapper{
private Legacy legacy = new Legacy();
public <T> T legacyMethodWrapper(Object obj ,Class<T> clazz) throws ClassCastException{
return clazz.cast(legacy.legacyMethod(obj));
}
}

关于Java:通用返回类型,使用类参数与括号调用之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40595390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com