Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 allow包?_Java_Generics_Openjdk - Fatal编程技术网

为什么';泛型方法定义中的Java allow包?

为什么';泛型方法定义中的Java allow包?,java,generics,openjdk,Java,Generics,Openjdk,问题: Java在尝试定义以下通用方法时似乎存在构建问题: public <otherPackage.TypeA, otherPackage.TypeB> void someMethod (otherPackage.TypeA a, otherPackage.TypeB b) B类 package otherPackage; public class TypeB { /* Do Nothing */ } 接口接口 package genericsTest; pub

问题:

Java在尝试定义以下通用方法时似乎存在构建问题:

public <otherPackage.TypeA, otherPackage.TypeB> 
    void someMethod (otherPackage.TypeA a, otherPackage.TypeB b)
B类

package otherPackage;
public class TypeB { /* Do Nothing */ }
接口接口

package genericsTest;   
public interface SomeInterface {
    <U, T> void someMethod (U u, T t);
}
packagenericstest;
公共接口{
方法(U,T);
}
一级

// This works
package genericsTest;
import otherPackage.TypeA;
import otherPackage.TypeB;
public class SomeClassOne implements SomeInterface 
{
    @Override
    public <TypeA, TypeB> void someMethod (TypeA a, TypeB b) 
    {
        // Do Nothing
    }
}
//这很管用
包装通用性测试;
导入otherPackage.TypeA;
导入otherPackage.TypeB;
公共类SomeClassOne实现了SomeInterface
{
@凌驾
公共方法(a型、b型)
{
//无所事事
}
}
第二类

// This doesn't seem to work
package genericsTest;
public class SomeClassTwo implements SomeInterface 
{
    @Override
    public <otherPackage.TypeA, otherPackage.TypeB> 
        void someMethod (otherPackage.TypeA a, otherPackage.TypeB b) 
    {
        // Do Nothing
    }
}
//这似乎不起作用
包装通用性测试;
公共类SomeClass2实现SomeInterface
{
@凌驾
公开的
void someMethod(otherPackage.TypeA a,otherPackage.TypeB)
{
//无所事事
}
}
如果有帮助/重要的话,我正在OpenJDK 1.8.0131中使用Intellij。

public void someMethod(TypeA a,TypeB)
指定泛型类型的“名称”/“占位符”(不是它的实际约束),因此
其他包。TypeA
是泛型类型的无效“名称”。相反,它需要更像

public <TA extends otherPackage.TypeA, TB extends otherPackage.TypeB> void someMethod (TA a, TB b) {...}
将等同于相同的事情,因此会引发更多的问题


您建议的两个选项都为我提供了以下错误:“方法不从其超类重写方法”。我忘了在我的原始提交中包含@Overrides。为了清晰起见,已添加了这些内容

抱歉,错过了
界面

您需要在
接口
中定义约束,或者类似于

public interface SomeInterface {
    public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t);
}
公共接口SomeInterface{
公共方法(U,T);
}
这样你就可以做

public class SomeClassOne implements SomeInterface {

    @Override
    public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t) {
    }

}
public class SomeClassOne implements SomeInterface<otherPackage.TypeA, otherPackage.TypeB> {

    @Override
    public void someMethod(TypeA u, TypeB t) {
    }

}
公共类SomeClassOne实现SomeInterface{
@凌驾
公共方法(U,T){
}
}
或者,我猜你是想

public interface SomeInterface<U, T> {
    public void someMethod(U u, T t);
}
公共接口SomeInterface{
公共方法(U,T);
}
这将允许你做

public class SomeClassOne implements SomeInterface {

    @Override
    public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t) {
    }

}
public class SomeClassOne implements SomeInterface<otherPackage.TypeA, otherPackage.TypeB> {

    @Override
    public void someMethod(TypeA u, TypeB t) {
    }

}
公共类SomeClassOne实现SomeInterface{
@凌驾
公共方法(类型A u、类型B t){
}
}
public void somethod(TypeA a,TypeB)
正在指定泛型类型的“名称”/“占位符”(不是它的实际约束),因此
otherPackage.TypeA
是泛型类型的无效“名称”。相反,它需要更像

public <TA extends otherPackage.TypeA, TB extends otherPackage.TypeB> void someMethod (TA a, TB b) {...}
将等同于相同的事情,因此会引发更多的问题


您建议的两个选项都为我提供了以下错误:“方法不从其超类重写方法”。我忘了在我的原始提交中包含@Overrides。为了清晰起见,已添加了这些内容

抱歉,错过了
界面

您需要在
接口
中定义约束,或者类似于

public interface SomeInterface {
    public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t);
}
公共接口SomeInterface{
公共方法(U,T);
}
这样你就可以做

public class SomeClassOne implements SomeInterface {

    @Override
    public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t) {
    }

}
public class SomeClassOne implements SomeInterface<otherPackage.TypeA, otherPackage.TypeB> {

    @Override
    public void someMethod(TypeA u, TypeB t) {
    }

}
公共类SomeClassOne实现SomeInterface{
@凌驾
公共方法(U,T){
}
}
或者,我猜你是想

public interface SomeInterface<U, T> {
    public void someMethod(U u, T t);
}
公共接口SomeInterface{
公共方法(U,T);
}
这将允许你做

public class SomeClassOne implements SomeInterface {

    @Override
    public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t) {
    }

}
public class SomeClassOne implements SomeInterface<otherPackage.TypeA, otherPackage.TypeB> {

    @Override
    public void someMethod(TypeA u, TypeB t) {
    }

}
公共类SomeClassOne实现SomeInterface{
@凌驾
公共方法(类型A u、类型B t){
}
}

您建议的两个选项都为我提供了以下错误:“方法不从其超类重写方法”。我忘了在我的原始提交中包含@Overrides。为了清晰起见,已添加了这些内容。根据您所描述的,我认为当我使用类/接口泛型包含包/约束时没有错误是有点奇怪的。例如:
public类SomeClassOne实现了SomeInterface
接口:
public接口SomeInterface
@Thaedrid
SomeInterface
需要定义可以使用的约束我熟悉泛型边界。不幸的是,我的类型不共享对象之外的公共父对象。我唯一真正的限制是项目所包含的包。如果这有助于理解问题,那么TypeA和TypeB都是自动生成的类,因此我无法修改它们以便在每个包中添加公共父类。谢谢!您肯定已经回答了我最初关于“名称”/“占位符”的问题。是否有理由允许您将约束/包包含在类/接口定义行中,而不包含在方法定义行中?这只是语言的一个怪癖吗?不,我已经演示了,如果您包含约束,那么您可以在约束中包含
package.class
,问题是,您将“占位符名称”与“约束”类型混合在一起。所以
无效,但
有效。我将稍微更新一下答案,因为我正在使用自动完成来加快速度;)您建议的两个选项都为我提供了以下错误:“方法不从其超类重写方法”。我忘了在我的原始提交中包含@Overrides。为了清晰起见,已添加了这些内容。根据您所描述的,我认为当我使用类/接口泛型包含包/约束时没有错误是有点奇怪的。例如:
public类SomeClassOne实现了SomeInterface
接口:
public接口SomeInterface
@Thaedrid
SomeInterface
需要定义可以使用的约束我熟悉泛型边界。不幸的是,我的类型不共享对象之外的公共父对象。我唯一真正的限制是项目所包含的包。如果它有助于理解