Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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推断泛型类型_Java_Generics_Type Parameter_Inferred Type - Fatal编程技术网

Java推断泛型类型

Java推断泛型类型,java,generics,type-parameter,inferred-type,Java,Generics,Type Parameter,Inferred Type,我正在寻找一个类似于推断捕获的泛型类型的概念,类似于下面的方法片段,但是对于捕获泛型类型的类: public <X, Y, Z> static void someMethod(ObjectInterface<X, Y, Z> object) { // code that uses inferred generic type parameters X, Y and Z... } 然后我还有其他类,它们必须捕获相当多的泛型类型变量,其中一个是实现ObjectInte

我正在寻找一个类似于推断捕获的泛型类型的概念,类似于下面的方法片段,但是对于捕获泛型类型的类:

public <X, Y, Z> static void someMethod(ObjectInterface<X, Y, Z> object) {
    // code that uses inferred generic type parameters X, Y and Z...
}
然后我还有其他类,它们必须捕获相当多的泛型类型变量,其中一个是实现
ObjectInterface
的对象。在这样的类中,我还需要对捕获的对象中定义的类型(
X
Y
Z
)具有句柄

以下代码(不理想,而且非常简化)可以工作:

public class ClassWorks<X, Y, Z, N extends ObjectInterface<X, Y, Z>> {
    // code body uses X, Y, Z and N...
}
编辑: 因此WishfullClass的一个实现示例是:

public类ImplementedObject实现ObjectInterface{
//...
}
公共类Wishfull示例{
公共静态void main(字符串[]args){
ObjectInterface ImplementedObject=新实现的对象();
WishFullClass示例=新的WishFullClass(/*可能的参数*/);
}
}
编译器应该从类的声明中知道
ImplementedObject
,该类将
ObjectInterface
实现为X、Y和Z

请注意,以上这些都是非常简单的,并且在实际代码中不是需要捕获的唯一参数,所以这三个额外的参数有很大的不同;此外,实现的对象还捕获泛型类型

因此,理想情况下,我只想集体捕获扩展
ObjectInterface
并推断出
X
Y
Z
的对象。有办法做到这一点吗

例如,someMethod的片段显示了如何推断方法范围的X、Y和Z。我的问题是,是否有一种方法可以通过只捕获扩展了
ObjectInterface
的类型来推断类的整个范围的X、Y和Z


我在措辞/解释这个问题时遇到了一些问题,因此如果有任何不确定性,请要求澄清:)

因此,在进一步研究之后,我在Joshua Block编写的《有效Java》教科书中找到了答案;项目27:支持通用方法。我想要的是在调用泛型构造函数时简化/减少类型参数的重复——也就是说,使其不那么麻烦,并且不重复已经给出的参数

确实不可能推断构造函数的类型,但是有一种方法可以利用泛型方法来减少构造函数的重复和类型参数,方法是为每个构造函数创建泛型工厂方法,并以这种方式推断类型参数

这是解释整个情况的信息,以下引用自教科书:

泛型方法的一个值得注意的特性是,不必像调用泛型构造函数时那样显式指定类型参数的值。编译器通过检查方法参数的类型来计算类型参数的值。在上面的程序中,编译器看到union的两个参数都是Set类型,因此它知道类型参数E必须是String。这个过程称为类型推断

如第1项所述,您可以利用泛型方法调用提供的类型推断来简化创建参数化类型实例的过程。为了刷新内存,在调用泛型构造函数时需要显式传递类型参数的值可能会很烦人。类型参数冗余地显示在变量声明的左侧和右侧:

//使用构造函数创建参数化类型实例`
Map anagrams=newhashmap();
要消除这种冗余,请编写一个与要使用的每个构造函数对应的通用静态工厂方法。例如,下面是与无参数HashMap构造函数相对应的通用静态工厂方法:

//通用静态工厂方法
公共静态HashMap newHashMap(){
返回新的HashMap();
}
使用此通用静态工厂方法,您可以用以下简洁的声明替换上面重复的声明:

//使用静态工厂创建参数化类型实例
Map anagrams=newHashMap();
如果语言在运行时执行相同的类型推断,那就太好了 在调用泛型方法时对泛型类型调用构造函数。也许有一天会,但从1.6版开始,就不会了

Map anagrams=newhashmap();

在Java7以后的版本中也会这样做<代码>是菱形运算符

使用类型变量(与任何其他变量一样)的唯一方法是使该类型变量位于范围内。因此,要么您必须声明它,要么在包含范围中必须已经有一个可见的。@AndyTurner Yes:)这就是问题的根源。。因此,我知道如何为方法推断变量X、Y、Z(无需显式指定变量-提供扩展ObjectInterface的对象就足够了),如第一个小代码片段所示,并在问题的开头进行了解释。我的问题是,是否可以从扩展ObjectInterface的类型参数N中推断出X、Y和Z,但这是在类的整个范围内。这是昨天意识到的。谢谢你添加这个。需要注意的一点是,在左边的声明中,重申X、Y和Z仍然必须重复。。i、 e.课堂。至少菱形操作符允许右侧的推断,这样就不那么麻烦了。
public class ClassWorks<X, Y, Z, N extends ObjectInterface<X, Y, Z>> {
    // code body uses X, Y, Z and N...
}
public class ImplementedObject implements ObjectInterface<Integer, Double, String> {
    //...
}

public class RandomExample {
    public static void main(String[] args) {
        ObjectInterface<Integer, Double, String> implementedObj = new ImplementedObject();
        ClassWorks<Integer, Double, String, ImplementedObject>> example = new ClassWorks<Integer, Double, String, ImplementedObject>(/* possible params */);
    }
}
pulic class WishfullClass<N extends ObjectInterface<X, Y, Z>> {
    // type N is captured; X, Y and Z is not explicitly captured.
    // code uses type N, as well as X, Y and Z
    // where, X, Y and Z is inferred somehow from N.
}
public class ImplementedObject implements ObjectInterface<Integer, Double, String> {
    //...
}

public class WishfullExample {
    public static void main(String[] args) {
        ObjectInterface<Integer, Double, String> implementedObj = new ImplementedObject();
        WishFullClass<ImplementedObject> example = new WishfullClass<ImplementedObject>(/* possible params */);
    }
}
// Parameterized type instance creation with constructor`
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
// Generic static factory method
public static <K,V> HashMap<K,V> newHashMap() {
    return new HashMap<K,V>();
}
// Parameterized type instance creation with static factory
Map<String, List<String>> anagrams = newHashMap();
Map<String, List<String>> anagrams = new HashMap<>();