gpt4 book ai didi

generics - 为什么 Java 不允许在泛型方法定义中封装?

转载 作者:行者123 更新时间:2023-12-01 19:59:20 25 4
gpt4 key购买 nike

问题:

当尝试定义通用方法时,Java 似乎存在构建问题,如下所示:

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

由于名称项目要求,我有几个具有相同名称的类。特别是,在我的实现中,我在命名空间 myPackage 中有一个名为 Thing 的类,它有一个带有参数 otherPackageOne.Thing 的方法。 >otherPackageTwo.Thing。我试图编写一个模板化方法来利用类型推断,而不必在使用接口(interface)时显式指定类型。

问题:

很简单,为什么 Java 在将包包含在 Generic 中时会出现问题?我的研究没有发现任何明显的迹象表明为什么方法泛型不允许包含包路径。我希望在这里提出这个问题能够深入了解为什么会发生这种情况。

注意:

快速说明一下,我已经计划重新设计代码,以便我拥有模板化接口(interface)而不是模板化方法。当将包包含在通用定义中时,模板化接口(interface)似乎没有问题。我只是希望了解为什么 Java 与我之前编写的代码方式存在问题。

这是我的代码示例:

A 类

package otherPackage;
public class TypeA { /* Do Nothing */ }

B 类

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

接口(interface)SomeInterface

package genericsTest;   
public interface SomeInterface {
<U, T> void someMethod (U u, T t);
}

类SomeClassOne

// 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
}
}

类SomeClassTwo

// 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)指定泛型类型的“名称”/“占位符”(不是实际的约束),所以 otherPackage.TypeA是泛型类型的无效“名称”。相反,它需要更像......

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) {
}

}

关于generics - 为什么 Java 不允许在泛型方法定义中封装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48513490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com