如何使用 T 类型的 set() 方法
How to use set() method for T type
我和 XML 医生一起工作。我的程序中有很多类似的标签和方法。他们都做同样的事情,但他们都 return 并且有不同的对象作为参数。在这个方法中,我检查了两个字符串。所以,可以用T代替不同的对象。所有这些对象都没有连接。例如,我想执行以下操作:
private <T> T checkBusinessEntityTypeCode(CheckDtKdt checkDtKdt, T kdtCode, T dtCode) {
if (kdtCode != null && dtCode != null) {
if (StringUtils.compare(kdtCode..getValue(), dtCode.getValue()) != 0) {
checkFieldsDtKdtService.save14Graph(checkDtKdt, dtCode.getValue(), kdtCode.getValue());
dtCode.setValue(kdtCode.getValue());
}
if (StringUtils.compare(kdtCode.getCodeListId(), dtCode.getCodeListId()) != 0) {
checkFieldsDtKdtService.save14Graph(checkDtKdt, dtCode.getCodeListId(), kdtCode.getCodeListId());
dtCode.setCodeListId(kdtCode.getCodeListId());
}
}
}
当然,这段代码是行不通的。因为 get() 和 set() 方法。我可以使用类似的东西吗?
您可以使用 Java 上界泛型 例如,您可以编写一个超级 class 来放置继承或抽象的 get 和 set 方法:
private <T extends ApplicationController> T checkBusinessEntityTypeCode(String checkDtKdt, T kdtCode, T dtCode){.... }
ApplicationController 是我们的 Superclass(可以是接口),所有“T”classes 都继承自它,因此来自任何 T 的所有引用都可以调用 get 和 set 方法。
请注意,在使用泛型之前,您需要阅读更多关于上限和下限泛型的信息,将边界与集合一起使用可以使集合不可变,还有许多其他技巧...
Link 到 Oracle 文档 : https://docs.oracle.com/javase/tutorial/java/generics/bounded.html
你可以从 Whosebug 阅读这个答案:
---------------------------------------------------
你的代码在我的 IDE 中编译,我可以使用参考 kdtCode(compile time) 调用 GvtApplicationController 的方法:
private <T extends GvtApplicationController> T checkBusinessEntityTypeCode(String checkDtKdt, T kdtCode, T dtCode) {
if (kdtCode != null && dtCode != null) {
kdtCode.getCurrentVersionPath();
}
return dtCode;
}
示例:
abstract class Person{
public abstract String getName();
}
class Student extends Person{
@Override
public String getName() {
return "MyName";
}
}
class GenericsBounder{
public static<T extends Person> String showName(T t){
return t.getName();
}
}
public class Bounder{
public static void main(String[] args) {
String s= GenericsBounder.showName(new Student());
System.out.println(s);
}
}
输出:
|MyName
我和 XML 医生一起工作。我的程序中有很多类似的标签和方法。他们都做同样的事情,但他们都 return 并且有不同的对象作为参数。在这个方法中,我检查了两个字符串。所以,可以用T代替不同的对象。所有这些对象都没有连接。例如,我想执行以下操作:
private <T> T checkBusinessEntityTypeCode(CheckDtKdt checkDtKdt, T kdtCode, T dtCode) {
if (kdtCode != null && dtCode != null) {
if (StringUtils.compare(kdtCode..getValue(), dtCode.getValue()) != 0) {
checkFieldsDtKdtService.save14Graph(checkDtKdt, dtCode.getValue(), kdtCode.getValue());
dtCode.setValue(kdtCode.getValue());
}
if (StringUtils.compare(kdtCode.getCodeListId(), dtCode.getCodeListId()) != 0) {
checkFieldsDtKdtService.save14Graph(checkDtKdt, dtCode.getCodeListId(), kdtCode.getCodeListId());
dtCode.setCodeListId(kdtCode.getCodeListId());
}
}
}
当然,这段代码是行不通的。因为 get() 和 set() 方法。我可以使用类似的东西吗?
您可以使用 Java 上界泛型 例如,您可以编写一个超级 class 来放置继承或抽象的 get 和 set 方法:
private <T extends ApplicationController> T checkBusinessEntityTypeCode(String checkDtKdt, T kdtCode, T dtCode){.... }
ApplicationController 是我们的 Superclass(可以是接口),所有“T”classes 都继承自它,因此来自任何 T 的所有引用都可以调用 get 和 set 方法。
请注意,在使用泛型之前,您需要阅读更多关于上限和下限泛型的信息,将边界与集合一起使用可以使集合不可变,还有许多其他技巧...
Link 到 Oracle 文档 : https://docs.oracle.com/javase/tutorial/java/generics/bounded.html
你可以从 Whosebug 阅读这个答案:
---------------------------------------------------
你的代码在我的 IDE 中编译,我可以使用参考 kdtCode(compile time) 调用 GvtApplicationController 的方法:
private <T extends GvtApplicationController> T checkBusinessEntityTypeCode(String checkDtKdt, T kdtCode, T dtCode) {
if (kdtCode != null && dtCode != null) {
kdtCode.getCurrentVersionPath();
}
return dtCode;
}
示例:
abstract class Person{
public abstract String getName();
}
class Student extends Person{
@Override
public String getName() {
return "MyName";
}
}
class GenericsBounder{
public static<T extends Person> String showName(T t){
return t.getName();
}
}
public class Bounder{
public static void main(String[] args) {
String s= GenericsBounder.showName(new Student());
System.out.println(s);
}
}
输出:
|MyName