-1
< T > T foo(P p) {
  ...
}

我会根据我插入的参数从 foo 中得到不同类型的返回,也就是说 T 根据 p 变化。

然后我尝试调用这个函数并使用它的返回结果。

x = foo(p);

我应该在这里写什么代替Class?

假设参数是枚举类型。

enum P {
   XX,YY,ZZ
}

那么根据参数返回类型T分别为Xx、Yy、Zz。

让我在这里给出确切的样本。

public <T> List<T> getProperty(Property property) {
  switch(property) {
  case NAME: List<Name> names = new ArrayList<Name>(); 
      names.add(this.name); return (List<T>) names;
  case PHONE: return (List<T>) this.phones; 
  case EMAIL: return (List<T>) this.emails;
  case ADDRESS: return (List<T>) this.addresses;
  case NOTE: List<Note> notes = new ArrayList<Note>();
      notes.add(this.note); return (List<T>) this.note;
  default: return null;
  }
}

public enum Property {
  NAME, PHONE, EMAIL, ADDRESS, NOTE
}

public List<Entry> search(Property property, String s) {
if(this.isEmpty()) {
  return null;
}
List<Entry> result = new ArrayList<Entry>();
for(Entry e : entries) {
  if(e.getProperty(property) != null) {
    for( **Object** p  : e.getProperty(property)) { //What should I write instead of Object
      if(p != null) {
        if(p.containString(s)) { //there'll be errors if use Object. Need to know p's class.
          result.add(e);
        }
      }
    }
  }
}
return this.nonDuplicatedResult(result);

}

4

4 回答 4

1

我真的不确定你在问什么。您根本没有解释您的用例,也没有给我们太多代码来查看。在混淆的迷雾中很难提供有用的反馈。

一般来说,如果您想要一个根据提供的参数的值返回不同对象的方法,那么您可能正在谈论的是一个静态工厂方法,它可以返回作为该方法返回类型的子类型的任何对象。使这些对象成为基于接口的类型系统的一部分很方便(例如,EnumSet 类的静态工厂)。

如果您希望返回枚举,则实际上需要使用基于接口的类型系统,因为枚举不能成为类层次结构的一部分,但它们可以实现形成基于接口的类型系统的接口。

于 2013-09-30T22:27:04.587 回答
1

假设参数是枚举类型。

enum P {
   XX,YY,ZZ
}

那么根据参数返回类型T分别为Xx、Yy、Zz。

不,不是。返回类型是 P。你想多了。“枚举”案例根本不是泛型的工作。

于 2013-09-30T22:28:59.983 回答
0

发生的事情基本上与该方法定义有关,您对编译器说的是您的方法将返回参数分配声明的任何内容。你可以这样做,但是你的方法是如何实现的将归结为一个编译器警告,因为你实际上不能确保你正在生成适当的类型——因为你不知道它,它永远不会传递给方法,并在编译时擦除。

更典型的是,你会做的是:

<T extends P> T foo(T p) {
    ...
}

现在您获得了一个正确类型的对象作为参数,因此您对返回什么有了一些了解。不过,这个概念对枚举没有什么用处。

这是一个真实世界的示例,您可以在其中使用您在问题中提出的方法定义:

    public static <T> T generateProxy(Object realObject, Class<?>... interfaces) {
        return (T) Proxy.newProxyInstance(realObject.getClass().getClassLoader(), interfaces, new SimpleInvocationHandler(realObject));
    }

当然,这种方法会产生编译器警告。现在,您在这里所说的是调用者将定义一个变量,并确保传递至少一个他们定义的类型的接口。如果他们不这样做,他们将在运行时以 ClassCastException 告终,但您避免调用通过显式转换知道它在做什么的代码。

这是否是一个好主意值得商榷。

所以简短的回答是你可以将 Class 定义为你想要的任何东西——编译器会接受任何东西——但是如果方法没有返回正确的类型,你会在运行时得到一个异常,所以这就是你如何实现方法。在没有正确类型作为参数的情况下,一个方法很少能足够聪明地返回正确的东西。而且,如果您不能将使用泛型类型声明的适当参数传递给方法,则必须处理编译器警告才能返回任何内容(null 除外)。

于 2013-09-30T22:35:19.043 回答
0

假设您有有限数量的返回类型,您可以使用 instanceof 检查每个返回值是否属于某种类型。所以在这种情况下Object会替换类,然后你可以稍后转换它。

于 2013-09-30T21:55:01.077 回答