Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接受泛型通配符,但不接受类型T_Java_Generics - Fatal编程技术网

Java 接受泛型通配符,但不接受类型T

Java 接受泛型通配符,但不接受类型T,java,generics,Java,Generics,对于以下情况,假设AModel.class扩展了ABCModel,则情况1 案例1有效 public static Class<? extends ABCModel> getModel(String objectModel) { if(objectModel.equalsIgnoreCase("")) { return AModel.class; } return nu

对于以下情况,假设AModel.class扩展了ABCModel,则情况1

案例1有效

public static Class<? extends ABCModel> getModel(String objectModel) {

                if(objectModel.equalsIgnoreCase("")) {
                    return AModel.class;
                }

    return null;

    }

publicstaticclass在第二种情况下,您约束类型变量
T
以扩展
ABCModel
,并承诺返回
Class
。但是,
T
不会被绑定到任何地方,因此在编译时无法确定什么是
T


示例1中的不同之处在于,返回类型定义为
Class,两者非常不同

在第一种情况下,您将返回一些扩展了
ABCModel
,由您决定的类。调用者不能假设任何关于类型参数的标识


在第二种情况下,您承诺返回类
T
,用于调用方想要的任何
T
!调用方可以调用方法,而
T
是它想要的,并且方法必须神奇地返回该类型参数的类,在这种情况下,根本不知道
T
是什么。这意味着您的方法必须同时返回具有相同代码的
,等等。这显然是不可能的(除非它总是返回
null
)。

问题的解决方案取决于您的用例:

如果您的方法确定特定类型并返回它,那么第一个示例就是正确的方法。试图进一步指定返回类型是没有用的,因为如果调用方需要指定返回类型,则无法回答“哪个子类型”的问题

但是,如果有多个方法调用,并且每个调用都将始终返回预期的子类型,则泛型返回类型很有用。在这种情况下,调用者将知道特定的返回类型,并可以使用该参数避免在调用站点上进行强制转换。您只需在实现中包含该强制转换:
return(Class)AModel.Class

第一个案例:

// The caller does not know the return type, so a simple unknown type is appropriate
Class<?> determineType(Object myObject) {
  return myObject.getClass(); 
}
//调用方不知道返回类型,因此简单的未知类型是合适的
类确定类型(对象myObject){
返回myObject.getClass();
}
第二个例子:

// The caller will already know that a property named 'street' will be of type String, so he can invoke <String>getTypedProperty("street") and avoid having to cast himself
<T> T getTypedProperty(String name) {
  return (T) genericPropertyStore.get(name);
}
//调用者已经知道名为“street”的属性将是String类型,因此他可以调用getTypedProperty(“street”)并避免强制转换自己
T getTypedProperty(字符串名称){
return(T)genericPropertyStore.get(name);
}

if
触发
true
,而
子类型不是
AModel
,而是您的
子类型,如果他们使用该子类型调用您的方法,该怎么办?对不起,您能解释一下吗?如果所有返回都是ABCModel的子类型,并且如果触发器为true,那么为什么不呢。
// The caller does not know the return type, so a simple unknown type is appropriate
Class<?> determineType(Object myObject) {
  return myObject.getClass(); 
}
// The caller will already know that a property named 'street' will be of type String, so he can invoke <String>getTypedProperty("street") and avoid having to cast himself
<T> T getTypedProperty(String name) {
  return (T) genericPropertyStore.get(name);
}