在android中处理我的项目时,我遇到了与方法重载相关的这个奇怪的问题(可能是我对java中缺乏理解泛型)。我在实用程序类中定义了以下静态方法,它给了我错误。
public static void getAllFromDatabase(Context context, ArrayList<Student> students) {
DatabaseHelper dh = new DatabaseHelper(context);
students = dh.getStudents();
dh.close();
}
public static void getAllFromDatabase(Context context, ArrayList<LogEntry> logs) {
DatabaseHelper dh = new DatabaseHelper(context);
logs = dh.getlog();
dh.close();
}
有任何帮助吗?提前谢谢。
答案 0 :(得分:0)
Remember to put the type parameter in the class definition.
- (IBAction)editButtonClicked:(id)sender {
AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:self.asset];
imageGenerator.maximumSize = CGSizeMake(200.0f,0.0f);
CMTime duration = self.asset.duration;
NSMutableArray *times = [NSMutableArray array];
CMTimeValue increment = duration.value/20;
NSLog(@"%lld",increment);
CMTimeValue currentValue = 0;
while (currentValue <= duration.value) {
NSLog(@"%lld",increment);
NSLog(@"currentValue==%lld",currentValue);
CMTime time = CMTimeMake(currentValue, duration.timescale);
CMTimeShow(time);
[times addObject:[NSValue valueWithCMTime:time]];
currentValue+=increment;
NSLog(@"%lld",increment);
NSLog(@"currentValue===%lld",currentValue);
}
__block NSUInteger imageCount = times.count;
__block NSMutableArray *images = [NSMutableArray array];
__block AVAssetImageGeneratorCompletionHandler handler;
[imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
static NSInteger counter = 0;
if (result == AVAssetImageGeneratorSucceeded) {
UIImage *image1 = [UIImage imageWithCGImage:image];
[images addObject:image1];
NSLog(@"%@",images);
counter++;
NSLog(@"%ld",(long)counter);
if(counter == imageCount){
NSLog(@"inside if");
dispatch_async(dispatch_get_main_queue(), ^{ // 2
MyTableViewController *myTableVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MyTableViewController"];
myTableVC.images = [images mutableCopy];
[self.navigationController pushViewController:myTableVC animated:YES];
});
}
}
else{
NSLog(@"Failed to create thumbNail image");
}
}];
您可以在https://docs.oracle.com/javase/tutorial/java/generics/types.html
上引用它答案 1 :(得分:0)
由于类型擦除过程,您遇到此问题,因为此后两种方法都相同。
来自Doc
在类型擦除过程中,Java编译器会擦除所有类型 参数并用类型的第一个边界替换每个参数 参数是有界的,如果类型参数是无界的,则为Object。
答案 2 :(得分:0)
这是因为 当Java实现泛型时,为了使字节码向后兼容,java擦除了使签名成为通用的类型,在运行时通用信息消失了,签名看起来像:
public static void getAllFromDatabase(Context context, ArrayList students);
public static void getAllFromDatabase(Context context, ArrayList logs);
因此,您有两个具有相同类型参数的方法,因此您将收到错误。 尝试更多; http://docs.oracle.com/javase/tutorial/java/generics/erasure.html
答案 3 :(得分:0)
大概是因为擦除;如果Java从一开始就有泛型,那么这可能不会发生。您可能会将两个参数视为不同的类型,但是当&lt;&gt;时如果删除,JVM将会看到两个方法,其中Map是其参数的类型。
您可以通过为方法提供不同的返回类型来作弊。虽然擦除后它们都具有相同的名称和参数,但字节代码会有所不同,因为整个签名不一样 - 返回类型不同
答案 4 :(得分:0)
由于Type Erasure,您收到错误。类型Erasure在编译时删除所有泛型信息。
方法解析在编译时进行,并且不考虑类型参数。
Java泛型使用类型擦除。括号<Student>
和<LogEntry>
中的位被删除,因此您最终会得到两个具有相同签名的方法。这是不允许的,因为运行时不知道每个案例使用哪个。