繁体   English   中英

Java泛型到变量

[英]Java Generics to variable

java泛型如何将其分配给变量然后传递? 我不想这样做

MyClass myClass = new MyClass();

if (someCondition) {
    myClass.<Foo>getDetails();
} else if (someCondition) {
    myClass.<Bar>getDetails();
} ... more conditional objects

我该如何实现:

MyClass myClass = new MyClass();
JavaGeneric jg;
if (someCondition) {
   jg = Foo;
} else if (someCondition) {
   jg = Bar;
}

myClass.<jg>getDetails();

这可能吗? 我试图搜索有关java generics的文档,但是没有这样的示例或如何将其分配给变量,它们仅具有将其传递给method/class (T)示例。

更新:

getDetails()object

public class MyClass {
   <T> void getDetails() {
      //call method that uses T...
   }
}

要实现您所期望的,您需要一个接口,并且类应该实现它。

interface JavaGeneric
{
   public String getDetails();
}

并且,现在在类中实现它。

class Foo implements JavaGeneric
{
     public String getDetails()
     {
           return "Foo";
     }
}

和,

class Bar implements JavaGeneric
{
     public String getDetails()
     {
           return "Bar";
     }
}

现在,在if-else创建实例,并在最后调用getDetails方法

JavaGeneric jg;
if (someCondition) {
   jg = new Foo();
} else if (someCondition) {
   jg = new Bar();
}

jg.getDetails ();

==更新==

我不太确定,您到底想达到什么目标。 但是,假设您需要概括化getDetails方法的返回类型。

interface JavaGeneric<T>
{
   public T getDetails();
}

然后,在实施时

class Foo<T> implements JavaGeneric<T>
{
     public T getDetails()
     {
          // your code
     }
}
interface JavaGeneric {
public String getDetails(); //also you can have default methods implementation here.
}

class Foo implements JavaGeneric {
 public String getDetails(){
   return "Foo Details";
 }
}


class Bar implements JavaGeneric {
 public String getDetails(){
   return "Bar Details";
 }
}


// Somewhere in code

JavaGeneric jg;
if (someCondition) { //lets say this is false
   jg = Foo;
} else if (someCondition) { // lets say this is true
   jg = Bar;
}

jg.getDetails(); //we will get "Bar Details"

刚打电话

myClass.getDetails()

由于类型擦除,两者之间没有区别

myClass.<T>getDetails()

myClass.<R>getDetails()

似乎仅是因为要在方法主体中使用类型变量T才将getDetails()声明为泛型。 类型变量T不是方法签名或其返回类型的一部分。

通常不需要。 根据您的方法实际执行的操作,也许您可​​以从方法声明中删除<T>并将T替换为? 邮件正文中的任何地方。

如果要将类型从变量传递给方法,请使用Class<?>参数:

public class MyClass {
   void getDetails(Class<?> cls) {
      //...
   }
}

然后,您只需要一个Class<?>类型的对象:

MyClass myClass = new MyClass();
Class<?> jg;
if (someCondition) {
   jg = Foo.class;
} else if (someCondition) {
   jg = Bar.class;
}

myClass.getDetails(jg);

由于类型擦除 ,泛型仅在编译时存在,因此无法从运行时变量传递泛型类型参数。 目前尚不清楚您对getDetails的类型实际上在做什么,但是如果您不能使其与Class<?>对象一起使用,则需要坚持第一个示例中的代码并使用单独的方法调用每种显式类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM