为什么 Java 不允许在通用方法定义中进行包?
Why doesn't Java allow package in Generic method definition?
问题:
Java 在尝试定义通用方法时似乎存在构建问题,如下所示:
public <otherPackage.TypeA, otherPackage.TypeB>
void someMethod (otherPackage.TypeA a, otherPackage.TypeB b)
由于名称项目的要求,我有几个同名的 class。特别是,在我的实现中,我在名称空间 myPackage
中有一个名为 Thing
的 class,它有一个带有参数 otherPackageOne.Thing
和 otherPackageTwo.Thing
的方法。我试图编写一个模板化方法来利用类型推断,而不是在使用接口时必须显式指定类型。
问题:
很简单,为什么 Java 在将包包含在 Generic 中时遇到问题?我的研究没有发现任何明显的迹象表明为什么方法泛型不允许包含包路径。我希望在这里提出这个问题可以深入了解为什么会发生这种情况。
注:
快速说明一下,我已经计划重新设计代码,以便使用模板化接口而不是模板化方法。在通用定义中包含包时,模板化接口似乎没有问题。我只是希望能够理解为什么 Java 对我之前编写代码的方式有疑问。
这是我的代码示例:
Class类型A
package otherPackage;
public class TypeA { /* Do Nothing */ }
Class 类型 B
package otherPackage;
public class TypeB { /* Do Nothing */ }
接口 SomeInterface
package genericsTest;
public interface SomeInterface {
<U, T> void someMethod (U u, T t);
}
Class一些Class一个
// 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
}
}
Class一些Class两个
// 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
}
}
如果有帮助/重要,我正在使用 Intellij 和 OpenJDK 1.8。0_131。
public <TypeA, TypeB> void someMethod (TypeA a, TypeB b)
指定泛型类型的 "name"/"placeholder"(不是实际约束),因此 otherPackage.TypeA
是无效的 "name"通用类型。相反,它需要更像...
public <TA extends otherPackage.TypeA, TB extends otherPackage.TypeB> void someMethod (TA a, TB b) {...}
取决于您要实现的目标。
虽然...
public void someMethod (otherPackage.TypeA a, otherPackage.TypeB b) {...}
会等同于同一件事,因此会引发更多问题
Both of the options that you have suggesting provide the following error for me: "Method does not override method from its superclass". I forgot to include the @Overrides in my original submission. They have been added in for clarity.
抱歉,错过了 interface
您需要在 interface
内定义约束,或者类似于...
public interface SomeInterface {
public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t);
}
这将允许你做...
public class SomeClassOne implements SomeInterface {
@Override
public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t) {
}
}
或者,我怀疑你想要...
public interface SomeInterface<U, T> {
public void someMethod(U u, T t);
}
这会让你做...
public class SomeClassOne implements SomeInterface<otherPackage.TypeA, otherPackage.TypeB> {
@Override
public void someMethod(TypeA u, TypeB t) {
}
}
问题:
Java 在尝试定义通用方法时似乎存在构建问题,如下所示:
public <otherPackage.TypeA, otherPackage.TypeB>
void someMethod (otherPackage.TypeA a, otherPackage.TypeB b)
由于名称项目的要求,我有几个同名的 class。特别是,在我的实现中,我在名称空间 myPackage
中有一个名为 Thing
的 class,它有一个带有参数 otherPackageOne.Thing
和 otherPackageTwo.Thing
的方法。我试图编写一个模板化方法来利用类型推断,而不是在使用接口时必须显式指定类型。
问题:
很简单,为什么 Java 在将包包含在 Generic 中时遇到问题?我的研究没有发现任何明显的迹象表明为什么方法泛型不允许包含包路径。我希望在这里提出这个问题可以深入了解为什么会发生这种情况。
注:
快速说明一下,我已经计划重新设计代码,以便使用模板化接口而不是模板化方法。在通用定义中包含包时,模板化接口似乎没有问题。我只是希望能够理解为什么 Java 对我之前编写代码的方式有疑问。
这是我的代码示例:
Class类型A
package otherPackage;
public class TypeA { /* Do Nothing */ }
Class 类型 B
package otherPackage;
public class TypeB { /* Do Nothing */ }
接口 SomeInterface
package genericsTest;
public interface SomeInterface {
<U, T> void someMethod (U u, T t);
}
Class一些Class一个
// 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
}
}
Class一些Class两个
// 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
}
}
如果有帮助/重要,我正在使用 Intellij 和 OpenJDK 1.8。0_131。
public <TypeA, TypeB> void someMethod (TypeA a, TypeB b)
指定泛型类型的 "name"/"placeholder"(不是实际约束),因此 otherPackage.TypeA
是无效的 "name"通用类型。相反,它需要更像...
public <TA extends otherPackage.TypeA, TB extends otherPackage.TypeB> void someMethod (TA a, TB b) {...}
取决于您要实现的目标。
虽然...
public void someMethod (otherPackage.TypeA a, otherPackage.TypeB b) {...}
会等同于同一件事,因此会引发更多问题
Both of the options that you have suggesting provide the following error for me: "Method does not override method from its superclass". I forgot to include the @Overrides in my original submission. They have been added in for clarity.
抱歉,错过了 interface
您需要在 interface
内定义约束,或者类似于...
public interface SomeInterface {
public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t);
}
这将允许你做...
public class SomeClassOne implements SomeInterface {
@Override
public <U extends otherPackage.TypeA, T extends otherPackage.TypeB> void someMethod(U u, T t) {
}
}
或者,我怀疑你想要...
public interface SomeInterface<U, T> {
public void someMethod(U u, T t);
}
这会让你做...
public class SomeClassOne implements SomeInterface<otherPackage.TypeA, otherPackage.TypeB> {
@Override
public void someMethod(TypeA u, TypeB t) {
}
}