如何使用泛型方法在Java中设置一些属性并获取未定义类的实例

如何使用泛型方法在Java中设置一些属性并获取未定义类的实例,java,generics,Java,Generics,问题更新了更多信息 我有一个测试类,在创建这个类的实例之后,我需要获取新类的实例并执行一些操作 public class searchTest { WebDriver driver; serchPage objSearch; searchResults objResults; @BeforeTest public void setup() { driver = new FirefoxDriver(); driver.get

问题更新了更多信息

我有一个测试类,在创建这个类的实例之后,我需要获取新类的实例并执行一些操作

public class searchTest {
    WebDriver driver;
    serchPage objSearch;
    searchResults objResults;

    @BeforeTest
    public void setup() {
        driver = new FirefoxDriver();
        driver.get("http://google.com");
    }

    @Test
    public void testSearch() {
        page = new serchPage(driver);
        page.get(Widget.class, "Name").click()

    }


}
serchPage类:

public class serchPage {
    WebDriver driver;
    By searchText = By.xpath("//div(@class='page1')");

    public serchPage(WebDriver driver){
        this.driver = driver;

    }

    WebElement parentWebElement = driver.findElement(searchText);


    public <T> T get(Class<T> expectedElment, String name) throws IllegalAccessException, InstantiationException {

        T newObj = expectedElment.newInstance();
        newObj.setParent(parentWebElement);
        newObj.setName(name);

        return newObj;
    }

}
 public <T> T get(Class<T> expectedElment, String name) throws IllegalAccessException, InstantiationException {

            T newObj = expectedElment.newInstance();
            newObj.setParent(parentWebElement);
            newObj.setName(name);

            return newObj;
        }
我正在寻找在serchPage类中使用泛型方法get的解决方案:

public class serchPage {
    WebDriver driver;
    By searchText = By.xpath("//div(@class='page1')");

    public serchPage(WebDriver driver){
        this.driver = driver;

    }

    WebElement parentWebElement = driver.findElement(searchText);


    public <T> T get(Class<T> expectedElment, String name) throws IllegalAccessException, InstantiationException {

        T newObj = expectedElment.newInstance();
        newObj.setParent(parentWebElement);
        newObj.setName(name);

        return newObj;
    }

}
 public <T> T get(Class<T> expectedElment, String name) throws IllegalAccessException, InstantiationException {

            T newObj = expectedElment.newInstance();
            newObj.setParent(parentWebElement);
            newObj.setName(name);

            return newObj;
        }
public T get(类ExpectedElement,字符串名)抛出IllegalAccessException、InstanceionException{
T newObj=expectedElment.newInstance();
newObj.setParent(parentWebElement);
newObj.setName(名称);
返回newObj;
}
问题是如何设置父类设置名称例如小部件类

有两个选项:

  • 您可以直接将实现绑定到
    小部件

    public <T extends widget> T get(Class<T> expectedElment, String name) throws IllegalAccessException, InstantiationException {
        T newObj = expectedElment.newInstance();
        newObj.setParent(parentWebElement);
        newObj.setName(name);
    
        return newObj;
    }
    
    public interface WidgetInterface {
        public WebElement setParent(WebElement parentWebElement);
    
        public String setName(String name);}
    }
    
    public class widget implements WidgetInterface {...}
    
    public <T extends WidgetInterface> T get(Class<T> expectedElment, String name) throws IllegalAccessException, InstantiationException {
        T newObj = expectedElment.newInstance();
        newObj.setParent(parentWebElement);
        newObj.setName(name);
    
        return newObj;
    }
    
  • 不使用泛型,您可以
    • 检查类对象是否为widget.class,并强制转换它并直接调用方法
    • 使用反射调用这些方法

  • 如果你想调用,你必须设置T的绑定。设置T的对象。既然你说它不起作用,我想你已经试过了。给我们你尝试过的,用真实的类名;包括错误消息(不是你对它所说的内容的转录,而是带有行号的实际消息,等等,以及它发生的时间)。如果我们有真正的工作要做,那么帮助就容易多了。如果没有这些,就很难说出你想要什么。“不工作”不是正确的问题描述。您需要解释它是如何工作的,以及为什么您认为它应该工作的(可能是一些文档片段)。另外,我还将发布代码,让我们重现您的问题。好吧,我提供了更多信息和描述,我认为我的问题显然是针对有经验的开发人员的。这可能是真的,但堆栈溢出的目的是创建一个好的问题和答案库,以便询问者希望您尽可能清楚地回答问题,所以,即使是没有经验的开发人员也能够理解您所面临的问题。这对你也有好处,因为你有更多的机会得到更好的答案(而且更快)。