有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我可以访问传递给引用派生类的泛型基类的类型的数据吗?

我有一个抽象的泛型基类,从中创建了两个派生类。基类有两种类型,这两种类型对于每个派生类都是不同的

我希望能够编写共享代码,允许我访问其中一个传递类型上的一个属性的方法。我不确定这是否可能

import lombok.Data;

@Data
public class GenericBase<T, U> {

    private T oneType;
    private U secondType;

    public GenericBase() {}
    public GenericBase(T oneType, U secondType) {
        this.oneType = oneType;
        this.secondType = secondType;
    }

}

import lombok.Data;

@Data
public class DerivedOne<C, C1> extends GenericBase<ClassOne, ClassTwo> {
    public DerivedOne(ClassOne classOne, ClassTwo classTwo) {
        super(classOne, classTwo);
    }

    private String dummyString;
    private String dummyName;

}

import lombok.Data;

@Data
public class DerivedTwo extends GenericBase<ClassThree, ClassFour>{

    public DerivedTwo(ClassThree classThree, ClassFour classFour) {
        super(classThree, classFour);
    }

    private Integer num1;
    private Integer num2;

}

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class ClassOne {

    private String name;
    private Integer age;
    private String address;

}

import lombok.AllArgsConstructor;
import lombok.Data;

@AllArgsConstructor
@Data
public class ClassTwo {

    private String ssNumber;
    private String dob;

}

import lombok.Data;
import lombok.AllArgsConstructor;

@Data
@AllArgsConstructor
public class ClassThree {

    private String someDescription;
    private int amount;

}

import lombok.Data;
import lombok.AllArgsConstructor;

@AllArgsConstructor
@Data
public class ClassFour {

    private Integer salary;
    private String carModel;

}

然后,如果我实例化“类型”类和派生类,我希望能够从该类访问一个方法

@SpringBootApplication
public class GenericsTestApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(GenericsTestApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        ClassOne c1 = new ClassOne("Fred", 27, "123 main street");
        ClassTwo c2 = new ClassTwo("123-45-6789", "03/21/57");
        ClassThree c3 = new ClassThree("some description", 25);
        ClassFour c4 = new ClassFour(25000, "Forester");
        DerivedOne<ClassOne, ClassTwo> d1 = new DerivedOne<>(c1, c2);
        DerivedTwo d2 = new DerivedTwo(c3, c4);
        Integer val = func1(d2);

    
    
    }

    static Integer func1(GenericBase genericBase) {
        return genericBase.getSecondType().getSalary();  <-- doesn't know how to resolve symbol getSalary
    }
}

我之所以希望这样做,是因为一个方法中存在一些重复的代码,这些代码存在于不同的类中,而这些类只因传入的派生类而异。因此,该方法是使用泛型基类定义的,它不知道用于创建派生类的类型的结构

有没有办法处理这个问题,或者我被重复的代码困住了

谢谢


共 (1) 个答案

  1. # 1 楼答案

    您可以声明一个像HasSalary这样的接口,并让ClassFour实现这个方法

    public interface HasSalary{
       Integer getSalary();
    }
    

    德拉卡:你是怎么做的

    static Integer func1(GenericBase<?,? extends HasSalary> genericBase) {
        return genericBase.getSecondType().getSalary();
    }